diff --git a/AUTHORS b/AUTHORS
index 7c0c78e..f521da12 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -298,6 +298,7 @@
 Gergely Nagy <ngg@ngg.hu>
 Getulio Sánchez <valentin2507@gmail.com>
 Gideon Pyzer <gjpyzer@gmail.com>
+Giovanni Panaro <tsrwebgl@gmail.com>
 Girish Kumar M <mck.giri@samsung.com>
 Gitanshu Mehndiratta <g.mehndiratt@samsung.com>
 Giuseppe Iuculano <giuseppe@iuculano.it>
diff --git a/DEPS b/DEPS
index 46ccfb0..226d73b 100644
--- a/DEPS
+++ b/DEPS
@@ -129,11 +129,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': 'acb4829c1be4bd6be53ea750effd94c07da95632',
+  'skia_revision': 'bb482ab871a29fad004f318210e0e01d44110a37',
   # 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': '804cfc5fb2ab8c49facc7a5f486c1555c2cbad63',
+  'v8_revision': '6859f97f97d4fce1850b2256b82435e7f412d5f5',
   # 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.
@@ -141,7 +141,7 @@
   # 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': '3115a0fc17fa8fb5af2490c58946de708dc17a17',
+  'angle_revision': '3f7ace324e178a9466f3f1a002e3e5a025c070df',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -188,7 +188,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling HarfBuzz
   # and whatever else without interference from each other.
-  'harfbuzz_revision': 'ec2a5dc859b03ceb92518aa992e4e9c053b30534',
+  'harfbuzz_revision': 'f3aca6aa267f7687a0406c7c545aefb5eed300b2',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Emoji Segmenter
   # and whatever else without interference from each other.
@@ -196,7 +196,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': '5b63b1f34a1b0536d67af70214035459c276f588',
+  'catapult_revision': '1ca62263a6307ab8ffcf90fdb00c9d8933d15d65',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
@@ -268,7 +268,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': '10c24684ab9cd1c747e251d7cb4590c43eecad6b',
+  'dawn_revision': '14487c34f7d9627711cbcab63af9ce853718762e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -1343,7 +1343,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '688fbfe33779392aa210d67d4aa12cb012f112c2',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '708eccc1bd2d0163e35df9605649e6cadd68f589',
+    Var('webrtc_git') + '/src.git' + '@' + '4e2d015be8f7898151d0b76366a00d856899fb61',
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
@@ -1384,7 +1384,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@2523c15caf5fee59aa11611e62ec46c83019562a',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@7ecd04321b1bf725d3745fe909363a6eade9a1f1',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/tools/system_webview_shell/BUILD.gn b/android_webview/tools/system_webview_shell/BUILD.gn
index 65f836b..586e3cd1 100644
--- a/android_webview/tools/system_webview_shell/BUILD.gn
+++ b/android_webview/tools/system_webview_shell/BUILD.gn
@@ -35,12 +35,16 @@
   deps = [
     ":system_webview_shell_apk_resources",
     "//base:base_java",
+    "//third_party/android_deps:android_support_v7_appcompat_java",
   ]
 }
 
 android_resources("system_webview_shell_apk_resources") {
   resource_dirs = [ "apk/res" ]
   custom_package = "org.chromium.webview_shell"
+  deps = [
+    "//third_party/android_deps:android_support_v7_appcompat_java",
+  ]
 }
 
 instrumentation_test_apk("system_webview_shell_page_cycler_apk") {
diff --git a/android_webview/tools/system_webview_shell/apk/AndroidManifest.xml b/android_webview/tools/system_webview_shell/apk/AndroidManifest.xml
index 1541bd7..a3d028f6 100644
--- a/android_webview/tools/system_webview_shell/apk/AndroidManifest.xml
+++ b/android_webview/tools/system_webview_shell/apk/AndroidManifest.xml
@@ -31,7 +31,7 @@
     <application
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
-        android:theme="@android:style/Theme.Light"
+        android:theme="@style/ShellTheme"
         android:networkSecurityConfig="@xml/network_security_config"
         android:debuggable="true" >
         <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
diff --git a/android_webview/tools/system_webview_shell/apk/res/drawable-mdpi/item_more_black.png b/android_webview/tools/system_webview_shell/apk/res/drawable-mdpi/item_more_black.png
deleted file mode 100644
index b984062..0000000
--- a/android_webview/tools/system_webview_shell/apk/res/drawable-mdpi/item_more_black.png
+++ /dev/null
Binary files differ
diff --git a/android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml b/android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml
index 80464d75..2440f6b 100644
--- a/android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml
+++ b/android_webview/tools/system_webview_shell/apk/res/layout/activity_webview_browser.xml
@@ -5,12 +5,18 @@
 -->
 
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/container"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="vertical"
     android:gravity="center">
+    <android.support.v7.widget.Toolbar
+         android:id="@+id/browser_toolbar"
+         android:layout_width="match_parent"
+         android:layout_height="?attr/actionBarSize"
+         android:elevation="4dp" />
     <LinearLayout
         android:orientation="horizontal"
         android:layout_width="match_parent"
@@ -26,16 +32,11 @@
             android:imeOptions="actionGo"
             android:importantForAutofill="no" />
         <ImageButton
+            android:id="@+id/btn_load_url"
+            android:background="@null"
             android:layout_width="wrap_content"
             android:layout_height="match_parent"
             android:src="@drawable/breadcrumb_arrow_black"
-            android:contentDescription="@string/load_url"
-            android:onClick="loadUrlFromUrlBar" />
-        <ImageButton
-            android:layout_width="wrap_content"
-            android:layout_height="match_parent"
-            android:src="@drawable/item_more_black"
-            android:contentDescription="@string/menu_about"
-            android:onClick="showPopup" />
+            android:contentDescription="@string/load_url" />
     </LinearLayout>
 </LinearLayout>
diff --git a/android_webview/tools/system_webview_shell/apk/res/values-night/colors.xml b/android_webview/tools/system_webview_shell/apk/res/values-night/colors.xml
new file mode 100644
index 0000000..35097b4
--- /dev/null
+++ b/android_webview/tools/system_webview_shell/apk/res/values-night/colors.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<resources>
+    <color name="url_color">#F2F2F2</color>
+    <color name="url_error_color">#F20000</color>
+</resources>
+
diff --git a/android_webview/tools/system_webview_shell/apk/res/values-v17/styles.xml b/android_webview/tools/system_webview_shell/apk/res/values-v17/styles.xml
new file mode 100644
index 0000000..c5f9995
--- /dev/null
+++ b/android_webview/tools/system_webview_shell/apk/res/values-v17/styles.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<resources>
+  <style name="ShellTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
+  </style>
+</resources>
diff --git a/android_webview/tools/system_webview_shell/apk/res/values/colors.xml b/android_webview/tools/system_webview_shell/apk/res/values/colors.xml
new file mode 100644
index 0000000..04bdcc3
--- /dev/null
+++ b/android_webview/tools/system_webview_shell/apk/res/values/colors.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- 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. -->
+
+<resources>
+  <color name="url_color">#080808</color>
+    <color name="url_error_color">#F20000</color>
+</resources>
diff --git a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
index 7ae371b..a80822a 100644
--- a/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
+++ b/android_webview/tools/system_webview_shell/apk/src/org/chromium/webview_shell/WebViewBrowserActivity.java
@@ -25,12 +25,14 @@
 import android.print.PrintDocumentAdapter;
 import android.print.PrintManager;
 import android.provider.Browser;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
 import android.util.SparseArray;
 import android.view.Gravity;
 import android.view.KeyEvent;
+import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
-import android.view.View.OnKeyListener;
 import android.view.ViewGroup;
 import android.view.ViewGroup.LayoutParams;
 import android.view.WindowManager;
@@ -45,10 +47,10 @@
 import android.webkit.WebViewClient;
 import android.widget.EditText;
 import android.widget.FrameLayout;
-import android.widget.PopupMenu;
 import android.widget.TextView;
 import android.widget.Toast;
 
+import org.chromium.base.ApiCompatibilityUtils;
 import org.chromium.base.Log;
 import org.chromium.base.StrictModeContext;
 
@@ -71,7 +73,7 @@
  * It takes an optional URL as an argument, and displays the page. There is a URL bar
  * on top of the webview for manually specifying URLs to load.
  */
-public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenuItemClickListener {
+public class WebViewBrowserActivity extends AppCompatActivity {
     private static final String TAG = "WebViewShell";
 
     // Our imaginary Android permission to associate with the WebKit geo permission
@@ -231,17 +233,16 @@
         super.onCreate(savedInstanceState);
         WebView.setWebContentsDebuggingEnabled(true);
         setContentView(R.layout.activity_webview_browser);
+        setSupportActionBar((Toolbar) findViewById(R.id.browser_toolbar));
         mUrlBar = (EditText) findViewById(R.id.url_field);
-        mUrlBar.setOnKeyListener(new OnKeyListener() {
-            @Override
-            public boolean onKey(View view, int keyCode, KeyEvent event) {
-                if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
-                    loadUrlFromUrlBar(view);
-                    return true;
-                }
-                return false;
+        mUrlBar.setOnKeyListener((View view, int keyCode, KeyEvent event) -> {
+            if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() == KeyEvent.ACTION_UP) {
+                loadUrlFromUrlBar(view);
+                return true;
             }
+            return false;
         });
+        findViewById(R.id.btn_load_url).setOnClickListener((view) -> loadUrlFromUrlBar(view));
 
         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                 .detectAll()
@@ -291,6 +292,7 @@
 
     @Override
     public void onSaveInstanceState(Bundle savedInstanceState) {
+        super.onSaveInstanceState(savedInstanceState);
         // Deliberately don't catch TransactionTooLargeException here.
         mWebView.saveState(savedInstanceState);
 
@@ -330,7 +332,8 @@
         } else {
             mWebViewVersion = "-";
         }
-        setTitle(getResources().getString(R.string.title_activity_browser) + " " + mWebViewVersion);
+        getSupportActionBar().setTitle(getResources().getString(R.string.title_activity_browser));
+        getSupportActionBar().setSubtitle(mWebViewVersion);
 
         webview.setWebViewClient(new WebViewClient() {
             @Override
@@ -503,17 +506,21 @@
         hideKeyboard(mUrlBar);
     }
 
-    public void showPopup(View v) {
-        PopupMenu popup = new PopupMenu(this, v);
-        popup.setOnMenuItemClickListener(this);
-        popup.inflate(R.menu.main_menu);
-        popup.getMenu().findItem(R.id.menu_enable_tracing).setChecked(mEnableTracing);
-        popup.show();
+    @Override
+    public boolean onCreateOptionsMenu(Menu menu) {
+        getMenuInflater().inflate(R.menu.main_menu, menu);
+        return true;
+    }
+
+    @Override
+    public boolean onPrepareOptionsMenu(Menu menu) {
+        menu.findItem(R.id.menu_enable_tracing).setChecked(mEnableTracing);
+        return true;
     }
 
     @Override
     @SuppressLint("NewApi") // TracingController related methods require API level 28.
-    public boolean onMenuItemClick(MenuItem item) {
+    public boolean onOptionsItemSelected(MenuItem item) {
         switch(item.getItemId()) {
             case R.id.menu_reset_webview:
                 if (mWebView != null) {
@@ -565,8 +572,9 @@
                 hideKeyboard(mUrlBar);
                 return true;
             default:
-                return false;
+                break;
         }
+        return super.onOptionsItemSelected(item);
     }
 
     // setGeolocationDatabasePath deprecated in api level 24,
@@ -647,7 +655,9 @@
     }
 
     private void setUrlFail(boolean fail) {
-        mUrlBar.setTextColor(fail ? Color.RED : Color.BLACK);
+        mUrlBar.setTextColor(fail ?
+            ApiCompatibilityUtils.getColor(getResources(), R.color.url_error_color) :
+            ApiCompatibilityUtils.getColor(getResources(), R.color.url_color));
     }
 
     /**
diff --git a/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java b/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
index dfd2320..bb2bdbe2 100644
--- a/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
+++ b/base/android/javatests/src/org/chromium/base/EarlyTraceEventTest.java
@@ -105,6 +105,7 @@
         EarlyTraceEvent.enable();
         long myThreadId = Process.myTid();
         long beforeNanos = Event.elapsedRealtimeNanos();
+        Assert.assertTrue(EarlyTraceEvent.sPendingEventByKey.isEmpty());
         try (TraceEvent e = TraceEvent.scoped(EVENT_NAME)) {
             // Required comment to pass presubmit checks.
         }
diff --git a/base/run_loop.cc b/base/run_loop.cc
index bb399f9..de03afc 100644
--- a/base/run_loop.cc
+++ b/base/run_loop.cc
@@ -126,6 +126,10 @@
 }
 
 void RunLoop::Run() {
+  RunWithTimeout(TimeDelta::Max());
+}
+
+void RunLoop::RunWithTimeout(TimeDelta timeout) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   if (!BeforeRun())
@@ -154,7 +158,7 @@
   const bool application_tasks_allowed =
       delegate_->active_run_loops_.size() == 1U ||
       type_ == Type::kNestableTasksAllowed;
-  delegate_->Run(application_tasks_allowed);
+  delegate_->Run(application_tasks_allowed, timeout);
 
   // Rebind this RunLoop to the current thread after Run().
   DETACH_FROM_SEQUENCE(sequence_checker_);
diff --git a/base/run_loop.h b/base/run_loop.h
index 92bc09c9..597d5de 100644
--- a/base/run_loop.h
+++ b/base/run_loop.h
@@ -75,6 +75,12 @@
   // RunLoop::Delegate asynchronously.
   void Run();
 
+  // Run the current RunLoop::Delegate. This blocks until either |timeout| has
+  // elapsed or Quit is called. Nesting multiple runloops with and without
+  // timeouts is supported. If an inner loop has a longer timeout than the outer
+  // loop, the outer loop will immediately exit when the inner one does.
+  void RunWithTimeout(TimeDelta timeout);
+
   // Run the current RunLoop::Delegate until it doesn't find any tasks or
   // messages in its queue (it goes idle).
   // WARNING #1: This may run long (flakily timeout) and even never return! Do
@@ -163,17 +169,18 @@
 
     // Used by RunLoop to inform its Delegate to Run/Quit. Implementations are
     // expected to keep on running synchronously from the Run() call until the
-    // eventual matching Quit() call. Upon receiving a Quit() call it should
-    // return from the Run() call as soon as possible without executing
-    // remaining tasks/messages. Run() calls can nest in which case each Quit()
-    // call should result in the topmost active Run() call returning. The only
-    // other trigger for Run() to return is the
-    // |should_quit_when_idle_callback_| which the Delegate should probe before
-    // sleeping when it becomes idle. |application_tasks_allowed| is true if
-    // this is the first Run() call on the stack or it was made from a nested
-    // RunLoop of Type::kNestableTasksAllowed (otherwise this Run() level should
-    // only process system tasks).
-    virtual void Run(bool application_tasks_allowed) = 0;
+    // eventual matching Quit() call or a delay of |timeout| expires. Upon
+    // receiving a Quit() call or timing out it should return from the Run()
+    // call as soon as possible without executing remaining tasks/messages.
+    // Run() calls can nest in which case each Quit() call should result in the
+    // topmost active Run() call returning. The only other trigger for Run()
+    // to return is the |should_quit_when_idle_callback_| which the Delegate
+    // should probe before sleeping when it becomes idle.
+    // |application_tasks_allowed| is true if this is the first Run() call on
+    // the stack or it was made from a nested RunLoop of
+    // Type::kNestableTasksAllowed (otherwise this Run() level should only
+    // process system tasks).
+    virtual void Run(bool application_tasks_allowed, TimeDelta timeout) = 0;
     virtual void Quit() = 0;
 
     // Invoked right before a RunLoop enters a nested Run() call on this
diff --git a/base/run_loop_unittest.cc b/base/run_loop_unittest.cc
index 90a6b71..8c023306 100644
--- a/base/run_loop_unittest.cc
+++ b/base/run_loop_unittest.cc
@@ -152,7 +152,7 @@
   }
 
  private:
-  void Run(bool application_tasks_allowed) override {
+  void Run(bool application_tasks_allowed, TimeDelta timeout) override {
     if (nested_run_allowing_tasks_incoming_) {
       EXPECT_TRUE(RunLoop::IsNestedOnCurrentThread());
       EXPECT_TRUE(application_tasks_allowed);
@@ -283,6 +283,122 @@
   run_loop_.Run();
 }
 
+TEST_P(RunLoopTest, RunWithTimeout) {
+  // SimpleSingleThreadTaskRunner doesn't support delayed tasks.
+  if (GetParam() == RunLoopTestType::kTestDelegate)
+    return;
+
+  bool task1_run = false;
+  bool task2_run = false;
+  bool task3_run = false;
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task1_run = true; }),
+      TimeDelta::FromMilliseconds(10));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task2_run = true; }),
+      TimeDelta::FromMilliseconds(20));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task3_run = true; }),
+      TimeDelta::FromSeconds(10));
+
+  run_loop_.RunWithTimeout(TimeDelta::FromMilliseconds(20));
+  EXPECT_TRUE(task1_run);
+  EXPECT_TRUE(task2_run);
+  EXPECT_FALSE(task3_run);
+}
+
+TEST_P(RunLoopTest, NestedRunWithTimeout) {
+  // SimpleSingleThreadTaskRunner doesn't support delayed tasks.
+  if (GetParam() == RunLoopTestType::kTestDelegate)
+    return;
+
+  bool task1_run = false;
+  bool task2_run = false;
+  bool task3_run = false;
+  bool task4_run = false;
+  bool task5_run = false;
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task1_run = true; }),
+      TimeDelta::FromMilliseconds(10));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        task2_run = true;
+        EXPECT_FALSE(task3_run);
+        RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
+        nested_run_loop.RunWithTimeout(TimeDelta::FromMilliseconds(20));
+        EXPECT_TRUE(task3_run);
+        EXPECT_TRUE(task4_run);
+      }),
+      TimeDelta::FromMilliseconds(20));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task3_run = true; }),
+      TimeDelta::FromMilliseconds(30));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task4_run = true; }),
+      TimeDelta::FromMilliseconds(40));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task5_run = true; }),
+      TimeDelta::FromSeconds(10));
+
+  run_loop_.RunWithTimeout(TimeDelta::FromMilliseconds(40));
+  EXPECT_TRUE(task1_run);
+  EXPECT_TRUE(task2_run);
+  EXPECT_TRUE(task3_run);
+  EXPECT_TRUE(task4_run);
+  EXPECT_FALSE(task5_run);
+}
+
+TEST_P(RunLoopTest, NestedRunWithTimeoutWhereInnerLoopHasALongerTimeout) {
+  // SimpleSingleThreadTaskRunner doesn't support delayed tasks.
+  if (GetParam() == RunLoopTestType::kTestDelegate)
+    return;
+
+  bool task1_run = false;
+  bool task2_run = false;
+  bool task3_run = false;
+  bool task4_run = false;
+  bool task5_run = false;
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task1_run = true; }),
+      TimeDelta::FromMilliseconds(10));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() {
+        task2_run = true;
+        EXPECT_FALSE(task3_run);
+        RunLoop nested_run_loop(RunLoop::Type::kNestableTasksAllowed);
+        nested_run_loop.RunWithTimeout(TimeDelta::FromMilliseconds(50));
+        EXPECT_TRUE(task3_run);
+        EXPECT_TRUE(task4_run);
+      }),
+      TimeDelta::FromMilliseconds(20));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task3_run = true; }),
+      TimeDelta::FromMilliseconds(30));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task4_run = true; }),
+      TimeDelta::FromMilliseconds(40));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task5_run = true; }),
+      TimeDelta::FromMilliseconds(50));
+
+  run_loop_.RunWithTimeout(TimeDelta::FromMilliseconds(40));
+  EXPECT_TRUE(task1_run);
+  EXPECT_TRUE(task2_run);
+  EXPECT_TRUE(task3_run);
+  EXPECT_TRUE(task4_run);
+  EXPECT_TRUE(task5_run);
+}
+
 // Verify that the QuitWhenIdleClosure() can run after the RunLoop has been
 // deleted. It should have no effect.
 TEST_P(RunLoopTest, QuitWhenIdleClosureAfterRunLoopScope) {
diff --git a/base/task/sequence_manager/sequence_manager.h b/base/task/sequence_manager/sequence_manager.h
index 4ff8edd..39d1c18 100644
--- a/base/task/sequence_manager/sequence_manager.h
+++ b/base/task/sequence_manager/sequence_manager.h
@@ -65,10 +65,41 @@
     // so we are making Settings move-only in preparation.
     Settings(Settings&& move_from) noexcept = default;
 
-    MessageLoop::Type message_loop_type = MessageLoop::Type::TYPE_DEFAULT;
+    MessageLoop::Type message_loop_type = MessageLoop::TYPE_DEFAULT;
     bool randomised_sampling_enabled = false;
     const TickClock* clock = DefaultTickClock::GetInstance();
 
+#if DCHECK_IS_ON()
+    // TODO(alexclarke): Consider adding command line flags to control these.
+    enum class TaskLogging {
+      kNone,
+      kEnabled,
+      kEnabledWithBacktrace,
+    };
+    TaskLogging task_execution_logging = TaskLogging::kNone;
+
+    // If true PostTask will emit a debug log.
+    bool log_post_task = false;
+
+    // If true debug logs will be emitted when a delayed task becomes eligible
+    // to run.
+    bool log_task_delay_expiry = false;
+
+    // Scheduler policy induced raciness is an area of concern. This lets us
+    // apply an extra delay per priority for cross thread posting.
+    TimeDelta
+        per_priority_cross_thread_task_delay[TaskQueue::kQueuePriorityCount];
+
+    // Like the above but for same thread posting.
+    TimeDelta
+        per_priority_same_thread_task_delay[TaskQueue::kQueuePriorityCount];
+
+    // If not zero this seeds a PRNG used by the task selection logic to choose
+    // a random TaskQueue for a given priority rather than the TaskQueue with
+    // the oldest EnqueueOrder.
+    int random_task_selection_seed = 0;
+#endif  // DCHECK_IS_ON()
+
     DISALLOW_COPY_AND_ASSIGN(Settings);
   };
 
@@ -80,12 +111,6 @@
   virtual void BindToCurrentThread() = 0;
 
   // Finishes the initialization for a SequenceManager created via
-  // CreateUnboundSequenceManager(nullptr). Must not be called in any other
-  // circumstances. Note it's assumed |message_loop| outlives the
-  // SequenceManager.
-  virtual void BindToMessageLoop(MessageLoopBase* message_loop_base) = 0;
-
-  // Finishes the initialization for a SequenceManager created via
   // CreateUnboundSequenceManagerWithPump(). Must not be called in any other
   // circumstances. The ownership of the pump is transferred to SequenceManager.
   virtual void BindToMessagePump(std::unique_ptr<MessagePump> message_pump) = 0;
diff --git a/base/task/sequence_manager/sequence_manager_impl.cc b/base/task/sequence_manager/sequence_manager_impl.cc
index 8c512a1..b7bdb5f 100644
--- a/base/task/sequence_manager/sequence_manager_impl.cc
+++ b/base/task/sequence_manager/sequence_manager_impl.cc
@@ -11,6 +11,7 @@
 #include "base/bit_cast.h"
 #include "base/compiler_specific.h"
 #include "base/debug/crash_logging.h"
+#include "base/debug/stack_trace.h"
 #include "base/json/json_writer.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop_current.h"
@@ -146,20 +147,19 @@
     SequenceManager::Settings settings)
     : associated_thread_(controller->GetAssociatedThread()),
       controller_(std::move(controller)),
-      type_(settings.message_loop_type),
+      settings_(std::move(settings)),
       metric_recording_settings_(InitializeMetricRecordingSettings(
-          settings.randomised_sampling_enabled)),
+          settings_.randomised_sampling_enabled)),
       empty_queues_to_reload_(associated_thread_),
       memory_corruption_sentinel_(kMemoryCorruptionSentinelValue),
-      main_thread_only_(associated_thread_,
-                        settings.randomised_sampling_enabled),
+      main_thread_only_(associated_thread_, settings_),
       weak_factory_(this) {
   TRACE_EVENT_OBJECT_CREATED_WITH_ID(
       TRACE_DISABLED_BY_DEFAULT("sequence_manager"), "SequenceManager", this);
   main_thread_only().selector.SetTaskQueueSelectorObserver(this);
 
   main_thread_only().next_time_to_reclaim_memory =
-      settings.clock->NowTicks() + kReclaimMemoryInterval;
+      settings_.clock->NowTicks() + kReclaimMemoryInterval;
 
   RegisterTimeDomain(main_thread_only().real_time_domain.get());
 
@@ -209,10 +209,10 @@
 
 SequenceManagerImpl::MainThreadOnly::MainThreadOnly(
     const scoped_refptr<AssociatedThreadId>& associated_thread,
-    bool randomised_sampling_enabled)
-    : selector(associated_thread),
+    const SequenceManager::Settings& settings)
+    : selector(associated_thread, settings),
       real_time_domain(new internal::RealTimeDomain()) {
-  if (randomised_sampling_enabled) {
+  if (settings.randomised_sampling_enabled) {
     random_generator = std::mt19937_64(RandUint64());
     uniform_distribution = std::uniform_real_distribution<double>(0.0, 1.0);
   }
@@ -222,11 +222,18 @@
 SequenceManagerImpl::MainThreadOnly::~MainThreadOnly() = default;
 
 // static
+std::unique_ptr<ThreadControllerImpl>
+SequenceManagerImpl::CreateThreadControllerImplForCurrentThread(
+    const TickClock* clock) {
+  auto* sequence_manager = GetTLSSequenceManagerImpl()->Get();
+  return ThreadControllerImpl::Create(sequence_manager, clock);
+}
+
+// static
 std::unique_ptr<SequenceManagerImpl> SequenceManagerImpl::CreateOnCurrentThread(
     SequenceManager::Settings settings) {
-  MessageLoopBase* message_loop_base = GetTLSSequenceManagerImpl()->Get();
   std::unique_ptr<SequenceManagerImpl> manager(new SequenceManagerImpl(
-      ThreadControllerImpl::Create(message_loop_base, settings.clock),
+      CreateThreadControllerImplForCurrentThread(settings.clock),
       std::move(settings)));
   manager->BindToCurrentThread();
   return manager;
@@ -251,20 +258,16 @@
                               std::move(settings)));
 }
 
-void SequenceManagerImpl::BindToMessageLoop(
-    MessageLoopBase* message_loop_base) {
-  controller_->BindToCurrentThread(message_loop_base);
-  CompleteInitializationOnBoundThread();
-}
-
 void SequenceManagerImpl::BindToMessagePump(std::unique_ptr<MessagePump> pump) {
   controller_->BindToCurrentThread(std::move(pump));
   CompleteInitializationOnBoundThread();
 
   // On Android attach to the native loop when there is one.
 #if defined(OS_ANDROID)
-  if (type_ == TYPE_UI || type_ == TYPE_JAVA)
+  if (settings_.message_loop_type == MessageLoop::TYPE_UI ||
+      settings_.message_loop_type == MessageLoop::TYPE_JAVA) {
     controller_->AttachToMessagePump();
+  }
 #endif
 }
 
@@ -460,9 +463,56 @@
                      "task_type", executing_task.task_type);
   TRACE_EVENT_BEGIN0("sequence_manager", executing_task.task_queue_name);
 
+#if DCHECK_IS_ON() && !defined(OS_NACL)
+  LogTaskDebugInfo(executing_task);
+#endif
+
   return task;
 }
 
+#if DCHECK_IS_ON() && !defined(OS_NACL)
+void SequenceManagerImpl::LogTaskDebugInfo(
+    const ExecutingTask& executing_task) {
+  switch (settings_.task_execution_logging) {
+    case Settings::TaskLogging::kNone:
+      break;
+
+    case Settings::TaskLogging::kEnabled:
+      DVLOG(1) << "#"
+               << static_cast<uint64_t>(
+                      executing_task.pending_task.enqueue_order())
+               << " " << executing_task.task_queue_name
+               << (executing_task.pending_task.cross_thread_
+                       ? " Run crossthread "
+                       : " Run ")
+               << executing_task.pending_task.posted_from.ToString();
+      break;
+
+    case Settings::TaskLogging::kEnabledWithBacktrace: {
+      std::array<const void*, PendingTask::kTaskBacktraceLength + 1> task_trace;
+      task_trace[0] = executing_task.pending_task.posted_from.program_counter();
+      std::copy(executing_task.pending_task.task_backtrace.begin(),
+                executing_task.pending_task.task_backtrace.end(),
+                task_trace.begin() + 1);
+      size_t length = 0;
+      while (length < task_trace.size() && task_trace[length])
+        ++length;
+      if (length == 0)
+        break;
+      DVLOG(1) << "#"
+               << static_cast<uint64_t>(
+                      executing_task.pending_task.enqueue_order())
+               << " " << executing_task.task_queue_name
+               << (executing_task.pending_task.cross_thread_
+                       ? " Run crossthread "
+                       : " Run ")
+               << debug::StackTrace(task_trace.data(), length);
+      break;
+    }
+  }
+}
+#endif  // DCHECK_IS_ON() && !defined(OS_NACL)
+
 Optional<PendingTask> SequenceManagerImpl::TakeTaskImpl() {
   CHECK(Validate());
 
@@ -909,7 +959,7 @@
 }
 
 MessageLoop::Type SequenceManagerImpl::GetType() const {
-  return type_;
+  return settings_.message_loop_type;
 }
 
 void SequenceManagerImpl::SetTaskExecutionAllowed(bool allowed) {
@@ -986,15 +1036,14 @@
 }
 
 bool SequenceManagerImpl::IsType(MessageLoop::Type type) const {
-  return type_ == type;
+  return settings_.message_loop_type == type;
 }
 
 NOINLINE bool SequenceManagerImpl::Validate() {
   return memory_corruption_sentinel_ == kMemoryCorruptionSentinelValue;
 }
 
-void SequenceManagerImpl::EnableCrashKeys(
-    const char* async_stack_crash_key) {
+void SequenceManagerImpl::EnableCrashKeys(const char* async_stack_crash_key) {
   DCHECK(!main_thread_only().async_stack_crash_key);
 #if !defined(OS_NACL)
   main_thread_only().async_stack_crash_key = debug::AllocateCrashKeyString(
diff --git a/base/task/sequence_manager/sequence_manager_impl.h b/base/task/sequence_manager/sequence_manager_impl.h
index d62f148a..42c2207 100644
--- a/base/task/sequence_manager/sequence_manager_impl.h
+++ b/base/task/sequence_manager/sequence_manager_impl.h
@@ -97,9 +97,10 @@
       scoped_refptr<SingleThreadTaskRunner> task_runner,
       SequenceManager::Settings settings);
 
+  void BindToMessageLoop(MessageLoopBase* message_loop_base);
+
   // SequenceManager implementation:
   void BindToCurrentThread() override;
-  void BindToMessageLoop(MessageLoopBase* message_loop_base) override;
   void BindToMessagePump(std::unique_ptr<MessagePump> message_pump) override;
   void SetObserver(Observer* observer) override;
   void AddTaskTimeObserver(TaskTimeObserver* task_time_observer) override;
@@ -186,6 +187,8 @@
     return associated_thread_;
   }
 
+  const Settings& settings() const { return settings_; }
+
   WeakPtr<SequenceManagerImpl> GetWeakPtr();
 
   // How frequently to perform housekeeping tasks (sweeping canceled tasks etc).
@@ -193,6 +196,9 @@
       TimeDelta::FromSeconds(30);
 
  protected:
+  static std::unique_ptr<ThreadControllerImpl>
+  CreateThreadControllerImplForCurrentThread(const TickClock* clock);
+
   // Create a task queue manager where |controller| controls the thread
   // on which the tasks are eventually run.
   SequenceManagerImpl(std::unique_ptr<internal::ThreadController> controller,
@@ -248,7 +254,7 @@
   struct MainThreadOnly {
     explicit MainThreadOnly(
         const scoped_refptr<AssociatedThreadId>& associated_thread,
-        bool randomised_sampling_enabled);
+        const SequenceManager::Settings& settings);
     ~MainThreadOnly();
 
     int nesting_depth = 0;
@@ -361,6 +367,10 @@
   // in TakeTask().
   Optional<PendingTask> TakeTaskImpl();
 
+#if DCHECK_IS_ON()
+  void LogTaskDebugInfo(const ExecutingTask& executing_task);
+#endif
+
   // Determines if wall time or thread time should be recorded for the next
   // task.
   TaskQueue::TaskTiming InitializeTaskTiming(
@@ -371,7 +381,7 @@
   internal::EnqueueOrder::Generator enqueue_order_generator_;
 
   const std::unique_ptr<internal::ThreadController> controller_;
-  const MessageLoop::Type type_;
+  const Settings settings_;
 
   const MetricRecordingSettings metric_recording_settings_;
 
diff --git a/base/task/sequence_manager/sequence_manager_impl_unittest.cc b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
index 0d2f0ed..f86410c6 100644
--- a/base/task/sequence_manager/sequence_manager_impl_unittest.cc
+++ b/base/task/sequence_manager/sequence_manager_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "base/callback_helpers.h"
 #include "base/location.h"
 #include "base/memory/ref_counted_memory.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/message_loop/message_pump_default.h"
@@ -25,8 +26,10 @@
 #include "base/strings/stringprintf.h"
 #include "base/synchronization/waitable_event.h"
 #include "base/task/sequence_manager/real_time_domain.h"
+#include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/task_queue_impl.h"
 #include "base/task/sequence_manager/task_queue_selector.h"
+#include "base/task/sequence_manager/tasks.h"
 #include "base/task/sequence_manager/test/mock_time_domain.h"
 #include "base/task/sequence_manager/test/mock_time_message_pump.h"
 #include "base/task/sequence_manager/test/sequence_manager_for_test.h"
@@ -301,11 +304,9 @@
     pump_ = pump.get();
     message_loop_ = std::make_unique<MessageLoop>(std::move(pump));
 
-    sequence_manager_ = SequenceManagerForTest::Create(
-        message_loop_->GetMessageLoopBase(), ThreadTaskRunnerHandle::Get(),
-        mock_tick_clock(),
-        SequenceManager::Settings{MessageLoop::Type::TYPE_DEFAULT, false,
-                                  mock_tick_clock()});
+    sequence_manager_ =
+        SequenceManagerForTest::CreateOnCurrentThread(SequenceManager::Settings{
+            MessageLoop::Type::TYPE_DEFAULT, false, mock_tick_clock()});
 
     // The SequenceManager constructor calls Now() once for setting up
     // housekeeping. The MessageLoop also contains a SequenceManager so two
@@ -3751,10 +3752,9 @@
   scoped_refptr<SingleThreadTaskRunner> custom_task_runner =
       MakeRefCounted<TestSimpleTaskRunner>();
   {
-    std::unique_ptr<SequenceManagerForTest> manager =
-        SequenceManagerForTest::Create(message_loop.GetMessageLoopBase(),
-                                       message_loop.task_runner(), nullptr,
-                                       SequenceManager::Settings());
+    std::unique_ptr<SequenceManager> manager =
+        CreateSequenceManagerOnCurrentThread(SequenceManager::Settings());
+
     manager->SetDefaultTaskRunner(custom_task_runner);
     DCHECK_EQ(custom_task_runner, message_loop.task_runner());
   }
diff --git a/base/task/sequence_manager/sequence_manager_perftest.cc b/base/task/sequence_manager/sequence_manager_perftest.cc
index 4c40f64a..1e90d37 100644
--- a/base/task/sequence_manager/sequence_manager_perftest.cc
+++ b/base/task/sequence_manager/sequence_manager_perftest.cc
@@ -161,9 +161,7 @@
  public:
   explicit SequenceManagerWithMessageLoopPerfTestDelegate(const char* name)
       : name_(name), message_loop_(new MessageLoopType()) {
-    SetSequenceManager(SequenceManagerForTest::Create(
-        message_loop_->GetMessageLoopBase(), message_loop_->task_runner(),
-        DefaultTickClock::GetInstance(),
+    SetSequenceManager(CreateSequenceManagerOnCurrentThread(
         SequenceManager::Settings{.randomised_sampling_enabled = false}));
   }
 
diff --git a/base/task/sequence_manager/task_queue.h b/base/task/sequence_manager/task_queue.h
index 62cf3e8..96e7337 100644
--- a/base/task/sequence_manager/task_queue.h
+++ b/base/task/sequence_manager/task_queue.h
@@ -14,6 +14,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/task/sequence_manager/lazy_now.h"
 #include "base/task/sequence_manager/tasks.h"
+#include "base/task/task_observer.h"
 #include "base/task/task_scheduler/scheduler_lock.h"
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
@@ -252,8 +253,8 @@
 
   // These functions can only be called on the same thread that the task queue
   // manager executes its tasks on.
-  void AddTaskObserver(MessageLoop::TaskObserver* task_observer);
-  void RemoveTaskObserver(MessageLoop::TaskObserver* task_observer);
+  void AddTaskObserver(TaskObserver* task_observer);
+  void RemoveTaskObserver(TaskObserver* task_observer);
 
   // Set the blame context which is entered and left while executing tasks from
   // this task queue. |blame_context| must be null or outlive this task queue.
diff --git a/base/task/sequence_manager/task_queue_impl.cc b/base/task/sequence_manager/task_queue_impl.cc
index 314fd48..2ed94a7 100644
--- a/base/task/sequence_manager/task_queue_impl.cc
+++ b/base/task/sequence_manager/task_queue_impl.cc
@@ -105,6 +105,7 @@
       should_notify_observers_(spec.should_notify_observers),
       delayed_fence_allowed_(spec.delayed_fence_allowed) {
   DCHECK(time_domain);
+  UpdateCrossThreadQueueStateLocked();
   // SequenceManager can't be set later, so we need to prevent task runners
   // from posting any tasks.
   if (sequence_manager_)
@@ -204,6 +205,11 @@
           ? TaskQueueImpl::CurrentThread::kMainThread
           : TaskQueueImpl::CurrentThread::kNotMainThread;
 
+#if DCHECK_IS_ON()
+  MaybeLogPostTask(&task);
+  MaybeAdjustTaskDelay(&task, current_thread);
+#endif  // DCHECK_IS_ON()
+
   if (task.delay.is_zero()) {
     PostImmediateTaskImpl(std::move(task), current_thread);
   } else {
@@ -211,6 +217,34 @@
   }
 }
 
+void TaskQueueImpl::MaybeLogPostTask(PostedTask* task) {
+#if DCHECK_IS_ON()
+  if (!sequence_manager_->settings().log_post_task)
+    return;
+
+  DVLOG(1) << name_ << " PostTask " << task->location.ToString() << " delay "
+           << task->delay;
+#endif  // DCHECK_IS_ON()
+}
+
+void TaskQueueImpl::MaybeAdjustTaskDelay(PostedTask* task,
+                                         CurrentThread current_thread) {
+#if DCHECK_IS_ON()
+  if (current_thread == TaskQueueImpl::CurrentThread::kNotMainThread) {
+    base::internal::AutoSchedulerLock lock(any_thread_lock_);
+    // Add a per-priority delay to cross thread tasks. This can help diagnose
+    // scheduler induced flakiness by making things flake most of the time.
+    task->delay +=
+        sequence_manager_->settings()
+            .per_priority_cross_thread_task_delay[any_thread_.queue_set_index];
+  } else {
+    task->delay +=
+        sequence_manager_->settings().per_priority_same_thread_task_delay
+            [main_thread_only().immediate_work_queue->work_queue_set_index()];
+  }
+#endif  // DCHECK_IS_ON()
+}
+
 void TaskQueueImpl::PostImmediateTaskImpl(PostedTask task,
                                           CurrentThread current_thread) {
   // Use CHECK instead of DCHECK to crash earlier. See http://crbug.com/711167
@@ -239,6 +273,12 @@
         any_thread_.immediate_incoming_queue.empty();
     any_thread_.immediate_incoming_queue.push_back(
         Task(std::move(task), now, sequence_number, sequence_number));
+
+#if DCHECK_IS_ON()
+    any_thread_.immediate_incoming_queue.back().cross_thread_ =
+        (current_thread == TaskQueueImpl::CurrentThread::kNotMainThread);
+#endif
+
     sequence_manager_->WillQueueTask(
         &any_thread_.immediate_incoming_queue.back(), name_);
 
@@ -329,6 +369,10 @@
     Task pending_task,
     TimeTicks now,
     bool notify_task_annotator) {
+#if DCHECK_IS_ON()
+  pending_task.cross_thread_ = false;
+#endif
+
   if (notify_task_annotator)
     sequence_manager_->WillQueueTask(&pending_task, name_);
   main_thread_only().delayed_incoming_queue.push(std::move(pending_task));
@@ -342,6 +386,10 @@
 void TaskQueueImpl::PushOntoDelayedIncomingQueue(Task pending_task) {
   sequence_manager_->WillQueueTask(&pending_task, name_);
 
+#if DCHECK_IS_ON()
+  pending_task.cross_thread_ = true;
+#endif
+
   // TODO(altimin): Add a copy method to Task to capture metadata here.
   PostImmediateTaskImpl(
       PostedTask(BindOnce(&TaskQueueImpl::ScheduleDelayedWorkTask,
@@ -490,6 +538,11 @@
     }
     if (task->delayed_run_time > lazy_now->Now())
       break;
+#if DCHECK_IS_ON()
+    if (sequence_manager_->settings().log_task_delay_expiry)
+      VLOG(0) << name_ << " Delay expired for " << task->posted_from.ToString();
+#endif  // DCHECK_IS_ON()
+
     ActivateDelayedFenceIfNeeded(task->delayed_run_time);
     DCHECK(!task->enqueue_order_set());
     task->set_enqueue_order(sequence_manager_->GetNextSequenceNumber());
@@ -862,6 +915,11 @@
     any_thread_.post_immediate_task_should_schedule_work =
         IsQueueEnabled() && !main_thread_only().current_fence;
   }
+
+#if DCHECK_IS_ON()
+  any_thread_.queue_set_index =
+      main_thread_only().immediate_work_queue->work_queue_set_index();
+#endif
 }
 
 void TaskQueueImpl::ReclaimMemory(TimeTicks now) {
diff --git a/base/task/sequence_manager/task_queue_impl.h b/base/task/sequence_manager/task_queue_impl.h
index 9a7f77f..2a84e78 100644
--- a/base/task/sequence_manager/task_queue_impl.h
+++ b/base/task/sequence_manager/task_queue_impl.h
@@ -14,7 +14,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
 #include "base/pending_task.h"
 #include "base/task/common/intrusive_heap.h"
 #include "base/task/common/operations_controller.h"
@@ -110,8 +109,8 @@
   Optional<DelayedWakeUp> GetNextScheduledWakeUpImpl();
   void SetQueuePriority(TaskQueue::QueuePriority priority);
   TaskQueue::QueuePriority GetQueuePriority() const;
-  void AddTaskObserver(MessageLoop::TaskObserver* task_observer);
-  void RemoveTaskObserver(MessageLoop::TaskObserver* task_observer);
+  void AddTaskObserver(TaskObserver* task_observer);
+  void RemoveTaskObserver(TaskObserver* task_observer);
   void SetTimeDomain(TimeDomain* time_domain);
   TimeDomain* GetTimeDomain() const;
   void SetBlameContext(trace_event::BlameContext* blame_context);
@@ -333,7 +332,7 @@
     std::unique_ptr<WorkQueue> delayed_work_queue;
     std::unique_ptr<WorkQueue> immediate_work_queue;
     DelayedIncomingQueue delayed_incoming_queue;
-    ObserverList<MessageLoop::TaskObserver>::Unchecked task_observers;
+    ObserverList<TaskObserver>::Unchecked task_observers;
     base::internal::HeapHandle heap_handle;
     bool is_enabled;
     trace_event::BlameContext* blame_context;  // Not owned.
@@ -403,6 +402,9 @@
   void UpdateCrossThreadQueueStateLocked()
       EXCLUSIVE_LOCKS_REQUIRED(any_thread_lock_);
 
+  void MaybeLogPostTask(PostedTask* task);
+  void MaybeAdjustTaskDelay(PostedTask* task, CurrentThread current_thread);
+
   const char* name_;
   SequenceManagerImpl* const sequence_manager_;
 
@@ -429,6 +431,14 @@
     bool post_immediate_task_should_schedule_work = true;
 
     bool unregistered = false;
+
+#if DCHECK_IS_ON()
+    // A cached of |immediate_work_queue->work_queue_set_index()| which is used
+    // to index into
+    // SequenceManager::Settings::per_priority_cross_thread_task_delay to apply
+    // a priority specific delay for debugging purposes.
+    int queue_set_index = 0;
+#endif
   };
 
   AnyThread any_thread_ GUARDED_BY(any_thread_lock_);
diff --git a/base/task/sequence_manager/task_queue_selector.cc b/base/task/sequence_manager/task_queue_selector.cc
index f556371b..706f8ac 100644
--- a/base/task/sequence_manager/task_queue_selector.cc
+++ b/base/task/sequence_manager/task_queue_selector.cc
@@ -20,10 +20,15 @@
 constexpr const int64_t TaskQueueSelector::per_priority_starvation_tolerance_[];
 
 TaskQueueSelector::TaskQueueSelector(
-    scoped_refptr<AssociatedThreadId> associated_thread)
+    scoped_refptr<AssociatedThreadId> associated_thread,
+    const SequenceManager::Settings& settings)
     : associated_thread_(std::move(associated_thread)),
-      delayed_work_queue_sets_("delayed", this),
-      immediate_work_queue_sets_("immediate", this) {}
+#if DCHECK_IS_ON()
+      random_task_selection_(settings.random_task_selection_seed != 0),
+#endif
+      delayed_work_queue_sets_("delayed", this, settings),
+      immediate_work_queue_sets_("immediate", this, settings) {
+}
 
 TaskQueueSelector::~TaskQueueSelector() = default;
 
@@ -150,56 +155,6 @@
   }
 }
 
-WorkQueue* TaskQueueSelector::ChooseOldestImmediateTaskWithPriority(
-    TaskQueue::QueuePriority priority) const {
-  return immediate_work_queue_sets_.GetOldestQueueInSet(priority);
-}
-
-WorkQueue* TaskQueueSelector::ChooseOldestDelayedTaskWithPriority(
-    TaskQueue::QueuePriority priority) const {
-  return delayed_work_queue_sets_.GetOldestQueueInSet(priority);
-}
-
-WorkQueue* TaskQueueSelector::ChooseOldestImmediateOrDelayedTaskWithPriority(
-    TaskQueue::QueuePriority priority,
-    bool* out_chose_delayed_over_immediate) const {
-  DCHECK_EQ(*out_chose_delayed_over_immediate, false);
-  EnqueueOrder immediate_enqueue_order;
-  WorkQueue* immediate_queue =
-      immediate_work_queue_sets_.GetOldestQueueAndEnqueueOrderInSet(
-          priority, &immediate_enqueue_order);
-  if (immediate_queue) {
-    EnqueueOrder delayed_enqueue_order;
-    WorkQueue* delayed_queue =
-        delayed_work_queue_sets_.GetOldestQueueAndEnqueueOrderInSet(
-            priority, &delayed_enqueue_order);
-    if (!delayed_queue)
-      return immediate_queue;
-
-    if (immediate_enqueue_order < delayed_enqueue_order) {
-      return immediate_queue;
-    } else {
-      *out_chose_delayed_over_immediate = true;
-      return delayed_queue;
-    }
-  }
-  return delayed_work_queue_sets_.GetOldestQueueInSet(priority);
-}
-
-WorkQueue* TaskQueueSelector::ChooseOldestWithPriority(
-    TaskQueue::QueuePriority priority,
-    bool* out_chose_delayed_over_immediate) const {
-  // Select an immediate work queue if we are starving immediate tasks.
-  if (immediate_starvation_count_ >= kMaxDelayedStarvationTasks) {
-    WorkQueue* queue = ChooseOldestImmediateTaskWithPriority(priority);
-    if (queue)
-      return queue;
-    return ChooseOldestDelayedTaskWithPriority(priority);
-  }
-  return ChooseOldestImmediateOrDelayedTaskWithPriority(
-      priority, out_chose_delayed_over_immediate);
-}
-
 #if DCHECK_IS_ON() || !defined(NDEBUG)
 bool TaskQueueSelector::CheckContainsQueueForTest(
     const internal::TaskQueueImpl* queue) const {
@@ -234,7 +189,13 @@
     selection_count_++;
 
   WorkQueue* queue =
-      ChooseOldestWithPriority(priority, &chose_delayed_over_immediate);
+#if DCHECK_IS_ON()
+      random_task_selection_ ? ChooseWithPriority<SetOperationRandom>(
+                                   priority, &chose_delayed_over_immediate)
+                             :
+#endif
+                             ChooseWithPriority<SetOperationOldest>(
+                                 priority, &chose_delayed_over_immediate);
 
   // If we still have any tasks remaining for |set_index| then adjust it's
   // sort key.
diff --git a/base/task/sequence_manager/task_queue_selector.h b/base/task/sequence_manager/task_queue_selector.h
index d9cc2996..db3e766b8 100644
--- a/base/task/sequence_manager/task_queue_selector.h
+++ b/base/task/sequence_manager/task_queue_selector.h
@@ -10,6 +10,7 @@
 #include "base/base_export.h"
 #include "base/macros.h"
 #include "base/pending_task.h"
+#include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/task_queue_selector_logic.h"
 #include "base/task/sequence_manager/work_queue_sets.h"
 
@@ -23,8 +24,9 @@
 // of particular task queues.
 class BASE_EXPORT TaskQueueSelector : public WorkQueueSets::Observer {
  public:
-  explicit TaskQueueSelector(
-      scoped_refptr<AssociatedThreadId> associated_thread);
+  TaskQueueSelector(scoped_refptr<AssociatedThreadId> associated_thread,
+                    const SequenceManager::Settings& settings);
+
   ~TaskQueueSelector() override;
 
   // Called to register a queue that can be selected. This function is called
@@ -75,10 +77,6 @@
   void WorkQueueSetBecameNonEmpty(size_t set_index) override;
 
  protected:
-  WorkQueue* ChooseOldestWithPriority(
-      TaskQueue::QueuePriority priority,
-      bool* out_chose_delayed_over_immediate) const;
-
   WorkQueueSets* delayed_work_queue_sets() { return &delayed_work_queue_sets_; }
 
   WorkQueueSets* immediate_work_queue_sets() {
@@ -141,6 +139,64 @@
     TaskQueue::QueuePriority index_to_id_[TaskQueue::kQueuePriorityCount];
   };
 
+  /*
+   * SetOperation is used to configure ChooseWithPriority() and must have:
+   *
+   * static WorkQueue* GetWithPriority(const WorkQueueSets& sets,
+   *                                   TaskQueue::QueuePriority priority);
+   *
+   * static WorkQueue* GetWithPriorityAndEnqueueOrder(
+   *     const WorkQueueSets& sets,
+   *     TaskQueue::QueuePriority priority
+   *     EnqueueOrder* enqueue_order);
+   */
+
+  // The default
+  struct SetOperationOldest {
+    static WorkQueue* GetWithPriority(const WorkQueueSets& sets,
+                                      TaskQueue::QueuePriority priority) {
+      return sets.GetOldestQueueInSet(priority);
+    }
+
+    static WorkQueue* GetWithPriorityAndEnqueueOrder(
+        const WorkQueueSets& sets,
+        TaskQueue::QueuePriority priority,
+        EnqueueOrder* enqueue_order) {
+      return sets.GetOldestQueueAndEnqueueOrderInSet(priority, enqueue_order);
+    }
+  };
+
+#if DCHECK_IS_ON()
+  struct SetOperationRandom {
+    static WorkQueue* GetWithPriority(const WorkQueueSets& sets,
+                                      TaskQueue::QueuePriority priority) {
+      return sets.GetRandomQueueInSet(priority);
+    }
+
+    static WorkQueue* GetWithPriorityAndEnqueueOrder(
+        const WorkQueueSets& sets,
+        TaskQueue::QueuePriority priority,
+        EnqueueOrder* enqueue_order) {
+      return sets.GetRandomQueueAndEnqueueOrderInSet(priority, enqueue_order);
+    }
+  };
+#endif  // DCHECK_IS_ON()
+
+  template <typename SetOperation>
+  WorkQueue* ChooseWithPriority(TaskQueue::QueuePriority priority,
+                                bool* out_chose_delayed_over_immediate) const {
+    // Select an immediate work queue if we are starving immediate tasks.
+    if (immediate_starvation_count_ >= kMaxDelayedStarvationTasks) {
+      WorkQueue* queue =
+          ChooseImmediateTaskWithPriority<SetOperation>(priority);
+      if (queue)
+        return queue;
+      return ChooseDelayedTaskWithPriority<SetOperation>(priority);
+    }
+    return ChooseImmediateOrDelayedTaskWithPriority<SetOperation>(
+        priority, out_chose_delayed_over_immediate);
+  }
+
  private:
   void ChangeSetIndex(internal::TaskQueueImpl* queue,
                       TaskQueue::QueuePriority priority);
@@ -152,15 +208,42 @@
   bool CheckContainsQueueForTest(const internal::TaskQueueImpl* queue) const;
 #endif
 
-  WorkQueue* ChooseOldestImmediateTaskWithPriority(
-      TaskQueue::QueuePriority priority) const;
+  template <typename SetOperation>
+  WorkQueue* ChooseImmediateTaskWithPriority(
+      TaskQueue::QueuePriority priority) const {
+    return SetOperation::GetWithPriority(immediate_work_queue_sets_, priority);
+  }
 
-  WorkQueue* ChooseOldestDelayedTaskWithPriority(
-      TaskQueue::QueuePriority priority) const;
+  template <typename SetOperation>
+  WorkQueue* ChooseDelayedTaskWithPriority(
+      TaskQueue::QueuePriority priority) const {
+    return SetOperation::GetWithPriority(delayed_work_queue_sets_, priority);
+  }
 
-  WorkQueue* ChooseOldestImmediateOrDelayedTaskWithPriority(
+  template <typename SetOperation>
+  WorkQueue* ChooseImmediateOrDelayedTaskWithPriority(
       TaskQueue::QueuePriority priority,
-      bool* out_chose_delayed_over_immediate) const;
+      bool* out_chose_delayed_over_immediate) const {
+    DCHECK_EQ(*out_chose_delayed_over_immediate, false);
+    EnqueueOrder immediate_enqueue_order;
+    WorkQueue* immediate_queue = SetOperation::GetWithPriorityAndEnqueueOrder(
+        immediate_work_queue_sets_, priority, &immediate_enqueue_order);
+    if (immediate_queue) {
+      EnqueueOrder delayed_enqueue_order;
+      WorkQueue* delayed_queue = SetOperation::GetWithPriorityAndEnqueueOrder(
+          delayed_work_queue_sets_, priority, &delayed_enqueue_order);
+      if (!delayed_queue)
+        return immediate_queue;
+
+      if (immediate_enqueue_order < delayed_enqueue_order) {
+        return immediate_queue;
+      } else {
+        *out_chose_delayed_over_immediate = true;
+        return delayed_queue;
+      }
+    }
+    return SetOperation::GetWithPriority(delayed_work_queue_sets_, priority);
+  }
 
   // Returns the priority which is next after |priority|.
   static TaskQueue::QueuePriority NextPriority(
@@ -171,6 +254,10 @@
 
   scoped_refptr<AssociatedThreadId> associated_thread_;
 
+#if DCHECK_IS_ON()
+  const bool random_task_selection_ = false;
+#endif
+
   // Count of the number of sets (delayed or immediate) for each priority.
   // Should only contain 0, 1 or 2.
   std::array<int, TaskQueue::kQueuePriorityCount> non_empty_set_counts_ = {{0}};
diff --git a/base/task/sequence_manager/task_queue_selector_unittest.cc b/base/task/sequence_manager/task_queue_selector_unittest.cc
index 6981a7f..d63860f 100644
--- a/base/task/sequence_manager/task_queue_selector_unittest.cc
+++ b/base/task/sequence_manager/task_queue_selector_unittest.cc
@@ -46,17 +46,18 @@
 
 class TaskQueueSelectorForTest : public TaskQueueSelector {
  public:
-  using TaskQueueSelector::ChooseOldestWithPriority;
+  using TaskQueueSelector::ChooseWithPriority;
   using TaskQueueSelector::delayed_work_queue_sets;
   using TaskQueueSelector::immediate_work_queue_sets;
   using TaskQueueSelector::kMaxHighPriorityStarvationScore;
   using TaskQueueSelector::kMaxLowPriorityStarvationScore;
   using TaskQueueSelector::kMaxNormalPriorityStarvationScore;
   using TaskQueueSelector::SetImmediateStarvationCountForTest;
+  using TaskQueueSelector::SetOperationOldest;
   using TaskQueueSelector::SmallPriorityQueue;
 
   TaskQueueSelectorForTest(scoped_refptr<AssociatedThreadId> associated_thread)
-      : TaskQueueSelector(associated_thread) {}
+      : TaskQueueSelector(associated_thread, SequenceManager::Settings()) {}
 };
 
 class TaskQueueSelectorTest : public testing::Test {
@@ -645,35 +646,41 @@
   EXPECT_FALSE(selector_.AllEnabledWorkQueuesAreEmpty());
 }
 
-TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_Empty) {
+TEST_F(TaskQueueSelectorTest, ChooseWithPriority_Empty) {
   bool chose_delayed_over_immediate = false;
-  EXPECT_EQ(nullptr,
-            selector_.ChooseOldestWithPriority(TaskQueue::kNormalPriority,
-                                               &chose_delayed_over_immediate));
+  EXPECT_EQ(
+      nullptr,
+      selector_
+          .ChooseWithPriority<TaskQueueSelectorForTest::SetOperationOldest>(
+              TaskQueue::kNormalPriority, &chose_delayed_over_immediate));
   EXPECT_FALSE(chose_delayed_over_immediate);
 }
 
-TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyDelayed) {
+TEST_F(TaskQueueSelectorTest, ChooseWithPriority_OnlyDelayed) {
   task_queues_[0]->delayed_work_queue()->Push(
       Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(),
            EnqueueOrder::FromIntForTesting(2)));
 
   bool chose_delayed_over_immediate = false;
-  EXPECT_EQ(task_queues_[0]->delayed_work_queue(),
-            selector_.ChooseOldestWithPriority(TaskQueue::kNormalPriority,
-                                               &chose_delayed_over_immediate));
+  EXPECT_EQ(
+      task_queues_[0]->delayed_work_queue(),
+      selector_
+          .ChooseWithPriority<TaskQueueSelectorForTest::SetOperationOldest>(
+              TaskQueue::kNormalPriority, &chose_delayed_over_immediate));
   EXPECT_FALSE(chose_delayed_over_immediate);
 }
 
-TEST_F(TaskQueueSelectorTest, ChooseOldestWithPriority_OnlyImmediate) {
+TEST_F(TaskQueueSelectorTest, ChooseWithPriority_OnlyImmediate) {
   task_queues_[0]->immediate_work_queue()->Push(
       Task(PostedTask(test_closure_, FROM_HERE), TimeTicks(), EnqueueOrder(),
            EnqueueOrder::FromIntForTesting(2)));
 
   bool chose_delayed_over_immediate = false;
-  EXPECT_EQ(task_queues_[0]->immediate_work_queue(),
-            selector_.ChooseOldestWithPriority(TaskQueue::kNormalPriority,
-                                               &chose_delayed_over_immediate));
+  EXPECT_EQ(
+      task_queues_[0]->immediate_work_queue(),
+      selector_
+          .ChooseWithPriority<TaskQueueSelectorForTest::SetOperationOldest>(
+              TaskQueue::kNormalPriority, &chose_delayed_over_immediate));
   EXPECT_FALSE(chose_delayed_over_immediate);
 }
 
@@ -745,7 +752,7 @@
   task_queue2->UnregisterTaskQueue();
 }
 
-struct ChooseOldestWithPriorityTestParam {
+struct ChooseWithPriorityTestParam {
   int delayed_task_enqueue_order;
   int immediate_task_enqueue_order;
   int immediate_starvation_count;
@@ -753,19 +760,18 @@
   bool expected_did_starve_immediate_queue;
 };
 
-static const ChooseOldestWithPriorityTestParam
-    kChooseOldestWithPriorityTestCases[] = {
-        {1, 2, 0, "delayed", true},    {1, 2, 1, "delayed", true},
-        {1, 2, 2, "delayed", true},    {1, 2, 3, "immediate", false},
-        {1, 2, 4, "immediate", false}, {2, 1, 4, "immediate", false},
-        {2, 1, 4, "immediate", false},
+static const ChooseWithPriorityTestParam kChooseWithPriorityTestCases[] = {
+    {1, 2, 0, "delayed", true},    {1, 2, 1, "delayed", true},
+    {1, 2, 2, "delayed", true},    {1, 2, 3, "immediate", false},
+    {1, 2, 4, "immediate", false}, {2, 1, 4, "immediate", false},
+    {2, 1, 4, "immediate", false},
 };
 
-class ChooseOldestWithPriorityTest
+class ChooseWithPriorityTest
     : public TaskQueueSelectorTest,
-      public testing::WithParamInterface<ChooseOldestWithPriorityTestParam> {};
+      public testing::WithParamInterface<ChooseWithPriorityTestParam> {};
 
-TEST_P(ChooseOldestWithPriorityTest, RoundRobinTest) {
+TEST_P(ChooseWithPriorityTest, RoundRobinTest) {
   task_queues_[0]->immediate_work_queue()->Push(Task(
       PostedTask(test_closure_, FROM_HERE), TimeTicks(),
       EnqueueOrder::FromIntForTesting(GetParam().immediate_task_enqueue_order),
@@ -781,17 +787,19 @@
       GetParam().immediate_starvation_count);
 
   bool chose_delayed_over_immediate = false;
-  WorkQueue* chosen_work_queue = selector_.ChooseOldestWithPriority(
-      TaskQueue::kNormalPriority, &chose_delayed_over_immediate);
+  WorkQueue* chosen_work_queue =
+      selector_
+          .ChooseWithPriority<TaskQueueSelectorForTest::SetOperationOldest>(
+              TaskQueue::kNormalPriority, &chose_delayed_over_immediate);
   EXPECT_EQ(chosen_work_queue->task_queue(), task_queues_[0].get());
   EXPECT_STREQ(chosen_work_queue->name(), GetParam().expected_work_queue_name);
   EXPECT_EQ(chose_delayed_over_immediate,
             GetParam().expected_did_starve_immediate_queue);
 }
 
-INSTANTIATE_TEST_SUITE_P(ChooseOldestWithPriorityTest,
-                         ChooseOldestWithPriorityTest,
-                         testing::ValuesIn(kChooseOldestWithPriorityTestCases));
+INSTANTIATE_TEST_SUITE_P(ChooseWithPriorityTest,
+                         ChooseWithPriorityTest,
+                         testing::ValuesIn(kChooseWithPriorityTestCases));
 
 class SmallPriorityQueueTest : public testing::Test {
  public:
diff --git a/base/task/sequence_manager/tasks.h b/base/task/sequence_manager/tasks.h
index a261969..f9658a7a 100644
--- a/base/task/sequence_manager/tasks.h
+++ b/base/task/sequence_manager/tasks.h
@@ -97,6 +97,10 @@
 
   TaskType task_type;
 
+#if DCHECK_IS_ON()
+  bool cross_thread_;
+#endif
+
  private:
   // Similar to |sequence_num|, but ultimately the |enqueue_order| is what
   // the scheduler uses for task ordering. For immediate tasks |enqueue_order|
diff --git a/base/task/sequence_manager/test/sequence_manager_for_test.cc b/base/task/sequence_manager/test/sequence_manager_for_test.cc
index 69c141b1..bef775f4 100644
--- a/base/task/sequence_manager/test/sequence_manager_for_test.cc
+++ b/base/task/sequence_manager/test/sequence_manager_for_test.cc
@@ -13,21 +13,22 @@
 
 class ThreadControllerForTest : public internal::ThreadControllerImpl {
  public:
-  ThreadControllerForTest(MessageLoopBase* message_loop_base,
-                          scoped_refptr<SingleThreadTaskRunner> task_runner,
-                          const TickClock* time_source)
-      : ThreadControllerImpl(message_loop_base,
+  ThreadControllerForTest(
+      internal::SequenceManagerImpl* funneled_sequence_manager,
+      scoped_refptr<SingleThreadTaskRunner> task_runner,
+      const TickClock* time_source)
+      : ThreadControllerImpl(funneled_sequence_manager,
                              std::move(task_runner),
                              time_source) {}
 
   void AddNestingObserver(RunLoop::NestingObserver* observer) override {
-    if (!message_loop_base_)
+    if (!funneled_sequence_manager_)
       return;
     ThreadControllerImpl::AddNestingObserver(observer);
   }
 
   void RemoveNestingObserver(RunLoop::NestingObserver* observer) override {
-    if (!message_loop_base_)
+    if (!funneled_sequence_manager_)
       return;
     ThreadControllerImpl::RemoveNestingObserver(observer);
   }
@@ -44,12 +45,12 @@
 
 // static
 std::unique_ptr<SequenceManagerForTest> SequenceManagerForTest::Create(
-    MessageLoopBase* message_loop_base,
+    SequenceManagerImpl* funneled_sequence_manager,
     scoped_refptr<SingleThreadTaskRunner> task_runner,
     const TickClock* clock,
     SequenceManager::Settings settings) {
   std::unique_ptr<SequenceManagerForTest> manager(new SequenceManagerForTest(
-      std::make_unique<ThreadControllerForTest>(message_loop_base,
+      std::make_unique<ThreadControllerForTest>(funneled_sequence_manager,
                                                 std::move(task_runner), clock),
       std::move(settings)));
   manager->BindToCurrentThread();
@@ -66,6 +67,14 @@
   return manager;
 }
 
+// static
+std::unique_ptr<SequenceManagerForTest>
+SequenceManagerForTest::CreateOnCurrentThread(
+    SequenceManager::Settings settings) {
+  return Create(CreateThreadControllerImplForCurrentThread(settings.clock),
+                std::move(settings));
+}
+
 size_t SequenceManagerForTest::ActiveQueuesCount() const {
   return main_thread_only().active_queues.size();
 }
diff --git a/base/task/sequence_manager/test/sequence_manager_for_test.h b/base/task/sequence_manager/test/sequence_manager_for_test.h
index 16f1a43..a609fa0 100644
--- a/base/task/sequence_manager/test/sequence_manager_for_test.h
+++ b/base/task/sequence_manager/test/sequence_manager_for_test.h
@@ -8,6 +8,7 @@
 #include <memory>
 
 #include "base/single_thread_task_runner.h"
+#include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/time/tick_clock.h"
 
@@ -23,7 +24,7 @@
   // the given arguments. ThreadControllerImpl is slightly overridden to skip
   // nesting observers registration if message loop is absent.
   static std::unique_ptr<SequenceManagerForTest> Create(
-      MessageLoopBase* message_loop_base,
+      SequenceManagerImpl* funneled_sequence_manager,
       scoped_refptr<SingleThreadTaskRunner> task_runner,
       const TickClock* clock,
       // Since most test calls are in Blink, randomised sampling is enabled
@@ -38,12 +39,17 @@
           base::MessageLoop::TYPE_DEFAULT,
           /*randomised_sampling_enabled=*/true});
 
+  static std::unique_ptr<SequenceManagerForTest> CreateOnCurrentThread(
+      SequenceManager::Settings);
+
   size_t ActiveQueuesCount() const;
   bool HasImmediateWork() const;
   size_t PendingTasksCount() const;
   size_t QueuesToDeleteCount() const;
   size_t QueuesToShutdownCount();
 
+  using internal::SequenceManagerImpl::
+      CreateThreadControllerImplForCurrentThread;
   using internal::SequenceManagerImpl::GetNextSequenceNumber;
   using internal::SequenceManagerImpl::MoveReadyDelayedTasksToWorkQueues;
   using internal::SequenceManagerImpl::ReloadEmptyWorkQueues;
diff --git a/base/task/sequence_manager/thread_controller.h b/base/task/sequence_manager/thread_controller.h
index 548867a4..be3ae92f 100644
--- a/base/task/sequence_manager/thread_controller.h
+++ b/base/task/sequence_manager/thread_controller.h
@@ -6,6 +6,7 @@
 #define BASE_TASK_SEQUENCE_MANAGER_THREAD_CONTROLLER_H_
 
 #include "base/message_loop/message_pump.h"
+#include "base/run_loop.h"
 #include "base/single_thread_task_runner.h"
 #include "base/task/sequence_manager/lazy_now.h"
 #include "base/time/time.h"
@@ -14,7 +15,6 @@
 namespace base {
 
 class MessageLoopBase;
-class MessagePump;
 class TickClock;
 struct PendingTask;
 
@@ -73,11 +73,6 @@
   // Completes delayed initialization of unbound ThreadControllers.
   // BindToCurrentThread(MessageLoopBase*) or BindToCurrentThread(MessagePump*)
   // may only be called once.
-  virtual void BindToCurrentThread(MessageLoopBase* message_loop_base) = 0;
-
-  // Completes delayed initialization of unbound ThreadControllers.
-  // BindToCurrentThread(MessageLoopBase*) or BindToCurrentThread(MessagePump*)
-  // may only be called once.
   virtual void BindToCurrentThread(
       std::unique_ptr<MessagePump> message_pump) = 0;
 
diff --git a/base/task/sequence_manager/thread_controller_impl.cc b/base/task/sequence_manager/thread_controller_impl.cc
index 1556577d..aba6306 100644
--- a/base/task/sequence_manager/thread_controller_impl.cc
+++ b/base/task/sequence_manager/thread_controller_impl.cc
@@ -8,10 +8,10 @@
 
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
-#include "base/message_loop/message_loop.h"
 #include "base/message_loop/message_pump.h"
 #include "base/run_loop.h"
 #include "base/task/sequence_manager/lazy_now.h"
+#include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/sequence_manager/sequenced_task_source.h"
 #include "base/trace_event/trace_event.h"
 
@@ -22,18 +22,19 @@
 using ShouldScheduleWork = WorkDeduplicator::ShouldScheduleWork;
 
 ThreadControllerImpl::ThreadControllerImpl(
-    MessageLoopBase* message_loop_base,
+    SequenceManagerImpl* funneled_sequence_manager,
     scoped_refptr<SingleThreadTaskRunner> task_runner,
     const TickClock* time_source)
-    : message_loop_base_(message_loop_base),
+    : funneled_sequence_manager_(funneled_sequence_manager),
       task_runner_(task_runner),
       associated_thread_(AssociatedThreadId::CreateUnbound()),
-      message_loop_task_runner_(
-          message_loop_base ? message_loop_base->GetTaskRunner() : nullptr),
+      message_loop_task_runner_(funneled_sequence_manager
+                                    ? funneled_sequence_manager->GetTaskRunner()
+                                    : nullptr),
       time_source_(time_source),
       work_deduplicator_(associated_thread_),
       weak_factory_(this) {
-  if (task_runner_ || message_loop_base_)
+  if (task_runner_ || funneled_sequence_manager_)
     work_deduplicator_.BindToCurrentThread();
   immediate_do_work_closure_ =
       BindRepeating(&ThreadControllerImpl::DoWork, weak_factory_.GetWeakPtr(),
@@ -50,11 +51,12 @@
 ThreadControllerImpl::MainSequenceOnly::~MainSequenceOnly() = default;
 
 std::unique_ptr<ThreadControllerImpl> ThreadControllerImpl::Create(
-    MessageLoopBase* message_loop_base,
+    SequenceManagerImpl* funneled_sequence_manager,
     const TickClock* time_source) {
   return WrapUnique(new ThreadControllerImpl(
-      message_loop_base,
-      message_loop_base ? message_loop_base->GetTaskRunner() : nullptr,
+      funneled_sequence_manager,
+      funneled_sequence_manager ? funneled_sequence_manager->GetTaskRunner()
+                                : nullptr,
       time_source));
 }
 
@@ -75,9 +77,9 @@
 }
 
 void ThreadControllerImpl::SetTimerSlack(TimerSlack timer_slack) {
-  if (!message_loop_base_)
+  if (!funneled_sequence_manager_)
     return;
-  message_loop_base_->SetTimerSlack(timer_slack);
+  funneled_sequence_manager_->SetTimerSlack(timer_slack);
 }
 
 void ThreadControllerImpl::ScheduleWork() {
@@ -134,36 +136,20 @@
 #if DCHECK_IS_ON()
   default_task_runner_set_ = true;
 #endif
-  if (!message_loop_base_)
+  if (!funneled_sequence_manager_)
     return;
-  message_loop_base_->SetTaskRunner(task_runner);
+  funneled_sequence_manager_->SetTaskRunner(task_runner);
 }
 
 scoped_refptr<SingleThreadTaskRunner>
 ThreadControllerImpl::GetDefaultTaskRunner() {
-  return message_loop_base_->GetTaskRunner();
+  return funneled_sequence_manager_->GetTaskRunner();
 }
 
 void ThreadControllerImpl::RestoreDefaultTaskRunner() {
-  if (!message_loop_base_)
+  if (!funneled_sequence_manager_)
     return;
-  message_loop_base_->SetTaskRunner(message_loop_task_runner_);
-}
-
-void ThreadControllerImpl::BindToCurrentThread(
-    MessageLoopBase* message_loop_base) {
-  DCHECK(!message_loop_base_);
-  DCHECK(message_loop_base);
-#if DCHECK_IS_ON()
-  DCHECK(!default_task_runner_set_) << "This would undo SetDefaultTaskRunner";
-#endif
-  message_loop_base_ = message_loop_base;
-  task_runner_ = message_loop_base->GetTaskRunner();
-  message_loop_task_runner_ = message_loop_base->GetTaskRunner();
-
-  if (work_deduplicator_.BindToCurrentThread() ==
-      ShouldScheduleWork::kScheduleImmediate)
-    task_runner_->PostTask(FROM_HERE, immediate_do_work_closure_);
+  funneled_sequence_manager_->SetTaskRunner(message_loop_task_runner_);
 }
 
 void ThreadControllerImpl::BindToCurrentThread(
diff --git a/base/task/sequence_manager/thread_controller_impl.h b/base/task/sequence_manager/thread_controller_impl.h
index 4ec8378..9a7967b 100644
--- a/base/task/sequence_manager/thread_controller_impl.h
+++ b/base/task/sequence_manager/thread_controller_impl.h
@@ -20,24 +20,24 @@
 #include "build/build_config.h"
 
 namespace base {
-
-class MessageLoopBase;
-
 namespace sequence_manager {
 namespace internal {
+class SequenceManagerImpl;
 
 // This is the interface between a SequenceManager which sits on top of an
-// underlying MessageLoop or SingleThreadTaskRunner. Currently it's only used
-// for workers in blink although we'd intend to migrate those to
-// ThreadControllerWithMessagePumpImpl. Long term we intend to use this for
-// sequence funneling.
+// underlying SequenceManagerImpl or SingleThreadTaskRunner. Currently it's only
+// used for workers in blink although we'd intend to migrate those to
+// ThreadControllerWithMessagePumpImpl (https://crbug.com/948051). Long term we
+// intend to use this for sequence funneling.
 class BASE_EXPORT ThreadControllerImpl : public ThreadController,
                                          public RunLoop::NestingObserver {
  public:
   ~ThreadControllerImpl() override;
 
+  // TODO(https://crbug.com/948051): replace |funneled_sequence_manager| with
+  // |funneled_task_runner| when we sort out the workers
   static std::unique_ptr<ThreadControllerImpl> Create(
-      MessageLoopBase* message_loop_base,
+      SequenceManagerImpl* funneled_sequence_manager,
       const TickClock* time_source);
 
   static std::unique_ptr<ThreadControllerImpl> CreateSequenceFunneled(
@@ -49,7 +49,6 @@
   void WillQueueTask(PendingTask* pending_task,
                      const char* task_queue_name) override;
   void ScheduleWork() override;
-  void BindToCurrentThread(MessageLoopBase* message_loop_base) override;
   void BindToCurrentThread(std::unique_ptr<MessagePump> message_pump) override;
   void SetNextDelayedDoWork(LazyNow* lazy_now, TimeTicks run_time) override;
   void SetSequencedTaskSource(SequencedTaskSource* sequence) override;
@@ -75,13 +74,13 @@
   void OnExitNestedRunLoop() override;
 
  protected:
-  ThreadControllerImpl(MessageLoopBase* message_loop_base,
+  ThreadControllerImpl(SequenceManagerImpl* sequence_manager,
                        scoped_refptr<SingleThreadTaskRunner> task_runner,
                        const TickClock* time_source);
 
   // TODO(altimin): Make these const. Blocked on removing
   // lazy initialisation support.
-  MessageLoopBase* message_loop_base_;
+  SequenceManagerImpl* funneled_sequence_manager_;
   scoped_refptr<SingleThreadTaskRunner> task_runner_;
 
   RunLoop::NestingObserver* nesting_observer_ = nullptr;
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
index 86886063..e748957 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.cc
@@ -73,12 +73,6 @@
 }
 
 void ThreadControllerWithMessagePumpImpl::BindToCurrentThread(
-    MessageLoopBase* message_loop_base) {
-  NOTREACHED()
-      << "ThreadControllerWithMessagePumpImpl doesn't support MessageLoops";
-}
-
-void ThreadControllerWithMessagePumpImpl::BindToCurrentThread(
     std::unique_ptr<MessagePump> message_pump) {
   associated_thread_->BindToCurrentThread();
   pump_ = std::move(message_pump);
@@ -242,6 +236,17 @@
   // avoid converting back-and-forth between TimeTicks and TimeDelta.
   main_thread_only().next_delayed_do_work =
       continuation_lazy_now.Now() + delay_till_next_task;
+
+  // Don't request a run time past |main_thread_only().quit_runloop_after|.
+  if (main_thread_only().next_delayed_do_work >
+      main_thread_only().quit_runloop_after) {
+    main_thread_only().next_delayed_do_work =
+        main_thread_only().quit_runloop_after;
+    // If we've passed |quit_runloop_after| there's no more work to do.
+    if (continuation_lazy_now.Now() >= main_thread_only().quit_runloop_after)
+      return {TimeTicks::Max()};
+  }
+
   return {CapAtOneDay(main_thread_only().next_delayed_do_work,
                       &continuation_lazy_now),
           continuation_lazy_now.Now()};
@@ -287,14 +292,22 @@
     *next_run_time = TimeTicks();
     next_task = WorkDeduplicator::NextTask::kIsImmediate;
   } else if (delay_till_next_task != TimeDelta::Max()) {
+    // Cancels any previously scheduled delayed wake-ups.
+    *next_run_time =
+        CapAtOneDay(delay_till_next_task + continuation_lazy_now.Now(),
+                    &continuation_lazy_now);
+
+    // Don't request a run time past |main_thread_only().quit_runloop_after|.
+    if (*next_run_time > main_thread_only().quit_runloop_after) {
+      *next_run_time = main_thread_only().quit_runloop_after;
+      // If we've passed |quit_runloop_after| there's no more work to do.
+      if (continuation_lazy_now.Now() >= main_thread_only().quit_runloop_after)
+        *next_run_time = TimeTicks();
+    }
+
     // The MessagePump will call ScheduleDelayedWork on our behalf, so we need
     // to update |main_thread_only().next_delayed_do_work|.
-    main_thread_only().next_delayed_do_work =
-        continuation_lazy_now.Now() + delay_till_next_task;
-
-    // Cancels any previously scheduled delayed wake-ups.
-    *next_run_time = CapAtOneDay(main_thread_only().next_delayed_do_work,
-                                 &continuation_lazy_now);
+    main_thread_only().next_delayed_do_work = *next_run_time;
   } else {
     // There's no more work to do.
     *next_run_time = TimeTicks();
@@ -312,8 +325,12 @@
 TimeDelta ThreadControllerWithMessagePumpImpl::DoWorkImpl(
     LazyNow* continuation_lazy_now,
     bool* ran_task) {
-  if (!main_thread_only().task_execution_allowed)
-    return TimeDelta::Max();
+  if (!main_thread_only().task_execution_allowed) {
+    if (main_thread_only().quit_runloop_after == TimeTicks::Max())
+      return TimeDelta::Max();
+    return main_thread_only().quit_runloop_after - continuation_lazy_now->Now();
+  }
+
   // Keep this in-sync with
   // third_party/catapult/tracing/tracing/extras/chrome/event_finder_utils.html
   // TODO(alexclarke): Rename this event to whatever we end up calling this
@@ -384,6 +401,13 @@
     return false;
   }
 
+  // Check if any runloop timeout has expired.
+  if (main_thread_only().quit_runloop_after != TimeTicks::Max() &&
+      main_thread_only().quit_runloop_after <= time_source_->NowTicks()) {
+    Quit();
+    return false;
+  }
+
   // RunLoop::Delegate knows whether we called Run() or RunUntilIdle().
   if (ShouldQuitWhenIdle())
     Quit();
@@ -391,8 +415,17 @@
   return false;
 }
 
-void ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed) {
+void ThreadControllerWithMessagePumpImpl::Run(bool application_tasks_allowed,
+                                              TimeDelta timeout) {
   DCHECK(RunsTasksInCurrentSequence());
+  // RunLoops can be nested so we need to restore the previous value of
+  // |quit_runloop_after| upon exit. NB we could use saturated arithmetic here
+  // but don't because we have some tests which assert the number of calls to
+  // Now.
+  AutoReset<TimeTicks> quit_runloop_after(
+      &main_thread_only().quit_runloop_after,
+      (timeout == TimeDelta::Max()) ? TimeTicks::Max()
+                                    : time_source_->NowTicks() + timeout);
   // Quit may have been called outside of a Run(), so |quit_pending| might be
   // true here. We can't use InTopLevelDoWork() in Quit() as this call may be
   // outside top-level DoWork but still in Run().
@@ -428,6 +461,7 @@
   DCHECK(RunsTasksInCurrentSequence());
   // Interrupt a batch of work.
   main_thread_only().quit_pending = true;
+
   // If we're in a nested RunLoop, continuation will be posted if necessary.
   pump_->Quit();
 }
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl.h b/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
index 91afa27..b138c7f 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl.h
@@ -12,6 +12,7 @@
 #include "base/run_loop.h"
 #include "base/task/common/task_annotator.h"
 #include "base/task/sequence_manager/associated_thread_id.h"
+#include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/sequence_manager/sequenced_task_source.h"
 #include "base/task/sequence_manager/thread_controller.h"
 #include "base/task/sequence_manager/work_deduplicator.h"
@@ -44,7 +45,6 @@
 
   // ThreadController implementation:
   void SetSequencedTaskSource(SequencedTaskSource* task_source) override;
-  void BindToCurrentThread(MessageLoopBase* message_loop_base) override;
   void BindToCurrentThread(std::unique_ptr<MessagePump> message_pump) override;
   void SetWorkBatchSize(int work_batch_size) override;
   void WillQueueTask(PendingTask* pending_task,
@@ -84,7 +84,7 @@
   bool DoIdleWork() override;
 
   // RunLoop::Delegate implementation.
-  void Run(bool application_tasks_allowed) override;
+  void Run(bool application_tasks_allowed, TimeDelta timeout) override;
   void Quit() override;
   void EnsureWorkScheduled() override;
 
@@ -122,6 +122,9 @@
     // When the next scheduled delayed work should run, if any.
     TimeTicks next_delayed_do_work = TimeTicks::Max();
 
+    // The time after which the runloop should quit.
+    TimeTicks quit_runloop_after = TimeTicks::Max();
+
     bool task_execution_allowed = true;
   };
 
diff --git a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
index 9f3e037..aa45ebc1 100644
--- a/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
+++ b/base/task/sequence_manager/thread_controller_with_message_pump_impl_unittest.cc
@@ -38,6 +38,7 @@
   using ThreadControllerWithMessagePumpImpl::DoWork;
   using ThreadControllerWithMessagePumpImpl::EnsureWorkScheduled;
   using ThreadControllerWithMessagePumpImpl::Quit;
+  using ThreadControllerWithMessagePumpImpl::Run;
 };
 
 class MockMessagePump : public MessagePump {
@@ -577,5 +578,37 @@
   EXPECT_TRUE(did_run);
 }
 
+TEST_F(ThreadControllerWithMessagePumpTest, RunWithTimeout) {
+  MockCallback<OnceClosure> task1;
+  task_source_.AddTask(PendingTask(FROM_HERE, task1.Get(), Seconds(5)));
+  MockCallback<OnceClosure> task2;
+  task_source_.AddTask(PendingTask(FROM_HERE, task2.Get(), Seconds(10)));
+  MockCallback<OnceClosure> task3;
+  task_source_.AddTask(PendingTask(FROM_HERE, task3.Get(), Seconds(20)));
+
+  EXPECT_CALL(*message_pump_, Run(_))
+      .WillOnce(Invoke([&](MessagePump::Delegate*) {
+        TimeTicks next_run_time;
+        clock_.SetNowTicks(Seconds(5));
+        EXPECT_CALL(task1, Run()).Times(1);
+        EXPECT_TRUE(thread_controller_.DoDelayedWork(&next_run_time));
+        EXPECT_EQ(next_run_time, Seconds(10));
+
+        clock_.SetNowTicks(Seconds(10));
+        EXPECT_CALL(task2, Run()).Times(1);
+        EXPECT_TRUE(thread_controller_.DoDelayedWork(&next_run_time));
+        EXPECT_EQ(next_run_time, Seconds(15));
+
+        clock_.SetNowTicks(Seconds(15));
+        EXPECT_CALL(task3, Run()).Times(0);
+        EXPECT_FALSE(thread_controller_.DoDelayedWork(&next_run_time));
+        EXPECT_EQ(next_run_time, TimeTicks());
+
+        EXPECT_CALL(*message_pump_, Quit());
+        EXPECT_FALSE(thread_controller_.DoIdleWork());
+      }));
+  thread_controller_.Run(true, TimeDelta::FromSeconds(15));
+}
+
 }  // namespace sequence_manager
 }  // namespace base
diff --git a/base/task/sequence_manager/work_queue.cc b/base/task/sequence_manager/work_queue.cc
index 206c0f1..b8c87b4 100644
--- a/base/task/sequence_manager/work_queue.cc
+++ b/base/task/sequence_manager/work_queue.cc
@@ -182,9 +182,15 @@
     tasks_.MaybeShrinkQueue();
   }
 
+#if DCHECK_IS_ON()
+  // If diagnostics are on it's possible task queues are being selected at
+  // random so we can't use the (slightly) more efficient OnPopMinQueueInSet.
+  work_queue_sets_->OnQueuesFrontTaskChanged(this);
+#else
   // OnPopMinQueueInSet calls GetFrontTaskEnqueueOrder which checks
   // BlockedByFence() so we don't need to here.
   work_queue_sets_->OnPopMinQueueInSet(this);
+#endif
   task_queue_->TraceQueueSize();
   return pending_task;
 }
diff --git a/base/task/sequence_manager/work_queue_sets.cc b/base/task/sequence_manager/work_queue_sets.cc
index a7b4945..c51e781 100644
--- a/base/task/sequence_manager/work_queue_sets.cc
+++ b/base/task/sequence_manager/work_queue_sets.cc
@@ -10,8 +10,15 @@
 namespace sequence_manager {
 namespace internal {
 
-WorkQueueSets::WorkQueueSets(const char* name, Observer* observer)
-    : name_(name), observer_(observer) {}
+WorkQueueSets::WorkQueueSets(const char* name,
+                             Observer* observer,
+                             const SequenceManager::Settings& settings)
+    : name_(name),
+#if DCHECK_IS_ON()
+      last_rand_(settings.random_task_selection_seed),
+#endif
+      observer_(observer) {
+}
 
 WorkQueueSets::~WorkQueueSets() = default;
 
@@ -162,6 +169,38 @@
   return oldest.value;
 }
 
+#if DCHECK_IS_ON()
+WorkQueue* WorkQueueSets::GetRandomQueueInSet(size_t set_index) const {
+  DCHECK_LT(set_index, work_queue_heaps_.size());
+  if (work_queue_heaps_[set_index].empty())
+    return nullptr;
+
+  WorkQueue* queue =
+      work_queue_heaps_[set_index]
+          .begin()[Random() % work_queue_heaps_[set_index].size()]
+          .value;
+  DCHECK_EQ(set_index, queue->work_queue_set_index());
+  DCHECK(queue->heap_handle().IsValid());
+  return queue;
+}
+
+WorkQueue* WorkQueueSets::GetRandomQueueAndEnqueueOrderInSet(
+    size_t set_index,
+    EnqueueOrder* out_enqueue_order) const {
+  DCHECK_LT(set_index, work_queue_heaps_.size());
+  if (work_queue_heaps_[set_index].empty())
+    return nullptr;
+  const OldestTaskEnqueueOrder& chosen =
+      work_queue_heaps_[set_index]
+          .begin()[Random() % work_queue_heaps_[set_index].size()];
+  *out_enqueue_order = chosen.key;
+  EnqueueOrder enqueue_order;
+  DCHECK(chosen.value->GetFrontTaskEnqueueOrder(&enqueue_order) &&
+         chosen.key == enqueue_order);
+  return chosen.value;
+}
+#endif
+
 bool WorkQueueSets::IsSetEmpty(size_t set_index) const {
   DCHECK_LT(set_index, work_queue_heaps_.size())
       << " set_index = " << set_index;
diff --git a/base/task/sequence_manager/work_queue_sets.h b/base/task/sequence_manager/work_queue_sets.h
index 68f8926..b3bde87 100644
--- a/base/task/sequence_manager/work_queue_sets.h
+++ b/base/task/sequence_manager/work_queue_sets.h
@@ -12,6 +12,7 @@
 #include "base/logging.h"
 #include "base/macros.h"
 #include "base/task/common/intrusive_heap.h"
+#include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/task_queue_impl.h"
 #include "base/task/sequence_manager/work_queue.h"
 #include "base/trace_event/traced_value.h"
@@ -37,7 +38,9 @@
     virtual void WorkQueueSetBecameNonEmpty(size_t set_index) = 0;
   };
 
-  WorkQueueSets(const char* name, Observer* observer);
+  WorkQueueSets(const char* name,
+                Observer* observer,
+                const SequenceManager::Settings& settings);
   ~WorkQueueSets();
 
   // O(log num queues)
@@ -71,6 +74,16 @@
       size_t set_index,
       EnqueueOrder* out_enqueue_order) const;
 
+#if DCHECK_IS_ON()
+  // O(1)
+  WorkQueue* GetRandomQueueInSet(size_t set_index) const;
+
+  // O(1)
+  WorkQueue* GetRandomQueueAndEnqueueOrderInSet(
+      size_t set_index,
+      EnqueueOrder* out_enqueue_order) const;
+#endif
+
   // O(1)
   bool IsSetEmpty(size_t set_index) const;
 
@@ -101,7 +114,6 @@
   };
 
   const char* const name_;
-  Observer* const observer_;
 
   // For each set |work_queue_heaps_| has a queue of WorkQueue ordered by the
   // oldest task in each WorkQueue.
@@ -109,6 +121,29 @@
              TaskQueue::kQueuePriorityCount>
       work_queue_heaps_;
 
+#if DCHECK_IS_ON()
+  static inline uint64_t MurmurHash3(uint64_t value) {
+    value ^= value >> 33;
+    value *= uint64_t{0xFF51AFD7ED558CCD};
+    value ^= value >> 33;
+    value *= uint64_t{0xC4CEB9FE1A85EC53};
+    value ^= value >> 33;
+    return value;
+  }
+
+  // This is for a debugging feature which lets us randomize task selection. Its
+  // not for production use.
+  // TODO(alexclarke): Use a seedable PRNG from ::base if one is added.
+  uint64_t Random() const {
+    last_rand_ = MurmurHash3(last_rand_);
+    return last_rand_;
+  }
+
+  mutable uint64_t last_rand_;
+#endif
+
+  Observer* const observer_;
+
   DISALLOW_COPY_AND_ASSIGN(WorkQueueSets);
 };
 
diff --git a/base/task/sequence_manager/work_queue_sets_unittest.cc b/base/task/sequence_manager/work_queue_sets_unittest.cc
index 9ed00f65..2332b26 100644
--- a/base/task/sequence_manager/work_queue_sets_unittest.cc
+++ b/base/task/sequence_manager/work_queue_sets_unittest.cc
@@ -30,7 +30,8 @@
 class WorkQueueSetsTest : public testing::Test {
  public:
   void SetUp() override {
-    work_queue_sets_.reset(new WorkQueueSets("test", &mock_observer_));
+    work_queue_sets_.reset(new WorkQueueSets("test", &mock_observer_,
+                                             SequenceManager::Settings()));
   }
 
   void TearDown() override {
diff --git a/base/task/sequence_manager/work_queue_unittest.cc b/base/task/sequence_manager/work_queue_unittest.cc
index 51e6d2a8..ccf6822 100644
--- a/base/task/sequence_manager/work_queue_unittest.cc
+++ b/base/task/sequence_manager/work_queue_unittest.cc
@@ -54,7 +54,8 @@
     work_queue_.reset(new WorkQueue(task_queue_.get(), "test",
                                     WorkQueue::QueueType::kImmediate));
     mock_observer_.reset(new MockObserver);
-    work_queue_sets_.reset(new WorkQueueSets("test", mock_observer_.get()));
+    work_queue_sets_.reset(new WorkQueueSets("test", mock_observer_.get(),
+                                             SequenceManager::Settings()));
     work_queue_sets_->AddQueue(work_queue_.get(), 0);
   }
 
diff --git a/base/test/test_mock_time_task_runner.cc b/base/test/test_mock_time_task_runner.cc
index f96a6b7..d22490b1 100644
--- a/base/test/test_mock_time_task_runner.cc
+++ b/base/test/test_mock_time_task_runner.cc
@@ -440,7 +440,8 @@
   return false;
 }
 
-void TestMockTimeTaskRunner::Run(bool application_tasks_allowed) {
+void TestMockTimeTaskRunner::Run(bool application_tasks_allowed,
+                                 TimeDelta timeout) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
   // Since TestMockTimeTaskRunner doesn't process system messages: there's no
@@ -451,7 +452,9 @@
       << "This is a nested RunLoop instance and needs to be of "
          "Type::kNestableTasksAllowed.";
 
-  while (!quit_run_loop_) {
+  // This computation relies on saturated arithmetic.
+  TimeTicks run_until = now_ticks_ + timeout;
+  while (!quit_run_loop_ && now_ticks_ < run_until) {
     RunUntilIdle();
     if (quit_run_loop_ || ShouldQuitWhenIdle())
       break;
@@ -469,7 +472,8 @@
           tasks_lock_cv_.Wait();
         continue;
       }
-      auto_fast_forward_by = tasks_.top().GetTimeToRun() - now_ticks_;
+      auto_fast_forward_by =
+          std::min(run_until, tasks_.top().GetTimeToRun()) - now_ticks_;
     }
     FastForwardBy(auto_fast_forward_by);
   }
diff --git a/base/test/test_mock_time_task_runner.h b/base/test/test_mock_time_task_runner.h
index dcfbcbd..97ad48a2 100644
--- a/base/test/test_mock_time_task_runner.h
+++ b/base/test/test_mock_time_task_runner.h
@@ -259,7 +259,7 @@
                        TestPendingTask* next_task);
 
   // RunLoop::Delegate:
-  void Run(bool application_tasks_allowed) override;
+  void Run(bool application_tasks_allowed, TimeDelta timeout) override;
   void Quit() override;
   void EnsureWorkScheduled() override;
 
diff --git a/base/test/test_mock_time_task_runner_unittest.cc b/base/test/test_mock_time_task_runner_unittest.cc
index 09516d3c..df8a2a2 100644
--- a/base/test/test_mock_time_task_runner_unittest.cc
+++ b/base/test/test_mock_time_task_runner_unittest.cc
@@ -190,6 +190,31 @@
   EXPECT_EQ(expected_value, counter);
 }
 
+TEST(TestMockTimeTaskRunnerTest, RunLoopRunWithTimeout) {
+  auto bound_mock_time_task_runner = MakeRefCounted<TestMockTimeTaskRunner>(
+      TestMockTimeTaskRunner::Type::kBoundToThread);
+  bool task1_ran = false;
+  bool task2_ran = false;
+  bool task3_ran = false;
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task1_ran = true; }),
+      TimeDelta::FromSeconds(3));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task2_ran = true; }),
+      TimeDelta::FromSeconds(33));
+
+  ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE, BindLambdaForTesting([&]() { task3_ran = true; }),
+      TimeDelta::FromSeconds(333));
+
+  RunLoop().RunWithTimeout(TimeDelta::FromSeconds(33));
+  EXPECT_TRUE(task1_ran);
+  EXPECT_TRUE(task2_ran);
+  EXPECT_FALSE(task3_ran);
+}
+
 TEST(TestMockTimeTaskRunnerTest, AvoidCaptureWhenBound) {
   // Make sure that capturing the active task runner --- which sometimes happens
   // unknowingly due to ThreadsafeObserverList deep within some singleton ---
diff --git a/build/android/test_runner.pydeps b/build/android/test_runner.pydeps
index 6b12405..ac5be46 100644
--- a/build/android/test_runner.pydeps
+++ b/build/android/test_runner.pydeps
@@ -7,7 +7,11 @@
 ../../third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/log.py
 ../../third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/meta_class.py
 ../../third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/multiprocessing_shim.py
+../../third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_proto_classes.py
+../../third_party/catapult/common/py_trace_event/py_trace_event/trace_event_impl/perfetto_trace_writer.py
 ../../third_party/catapult/common/py_trace_event/py_trace_event/trace_time.py
+../../third_party/catapult/common/py_trace_event/third_party/protobuf/encoder.py
+../../third_party/catapult/common/py_trace_event/third_party/protobuf/wire_format.py
 ../../third_party/catapult/common/py_utils/py_utils/__init__.py
 ../../third_party/catapult/common/py_utils/py_utils/cloud_storage.py
 ../../third_party/catapult/common/py_utils/py_utils/cloud_storage_global_lock.py
diff --git a/build/fuchsia/linux.sdk.sha1 b/build/fuchsia/linux.sdk.sha1
index 947d51c..8204123 100644
--- a/build/fuchsia/linux.sdk.sha1
+++ b/build/fuchsia/linux.sdk.sha1
@@ -1 +1 @@
-8917444505235389856
\ No newline at end of file
+8917392474473813296
\ No newline at end of file
diff --git a/build/fuchsia/mac.sdk.sha1 b/build/fuchsia/mac.sdk.sha1
index b1f8579..14ca69c 100644
--- a/build/fuchsia/mac.sdk.sha1
+++ b/build/fuchsia/mac.sdk.sha1
@@ -1 +1 @@
-8917450276044616784
\ No newline at end of file
+8917392472953448288
\ No newline at end of file
diff --git a/chrome/VERSION b/chrome/VERSION
index d4f1fe7b..e0f316c9 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=75
 MINOR=0
-BUILD=3753
+BUILD=3754
 PATCH=0
diff --git a/chrome/android/chrome_test_java_sources.gni b/chrome/android/chrome_test_java_sources.gni
index b84b11b..8d3c2374 100644
--- a/chrome/android/chrome_test_java_sources.gni
+++ b/chrome/android/chrome_test_java_sources.gni
@@ -73,6 +73,7 @@
   "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java",
   "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java",
+  "javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java",
   "javatests/src/org/chromium/chrome/browser/banners/AppBannerManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkBridgeTest.java",
   "javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkModelTest.java",
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java
index 3343a63..8defb17 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetails.java
@@ -24,6 +24,7 @@
 
     private final String mTitle;
     private final String mImageUrl;
+    private final boolean mShowAttribution;
     private final boolean mShowImagePlaceholder;
     @Nullable
     private final Date mDate;
@@ -47,13 +48,15 @@
     /** An optional price label, such as 'Estimated Total incl. VAT'. */
     private final String mTotalPriceLabel;
 
-    public AssistantDetails(String title, String imageUrl, boolean showImagePlaceholder,
-            String totalPriceLabel, String totalPrice, @Nullable Date date, String descriptionLine1,
-            String descriptionLine2, boolean userApprovalRequired, boolean highlightTitle,
-            boolean highlightLine1, boolean highlightLine2, boolean animatePlaceholders) {
+    public AssistantDetails(String title, String imageUrl, boolean showAttribution,
+            boolean showImagePlaceholder, String totalPriceLabel, String totalPrice,
+            @Nullable Date date, String descriptionLine1, String descriptionLine2,
+            boolean userApprovalRequired, boolean highlightTitle, boolean highlightLine1,
+            boolean highlightLine2, boolean animatePlaceholders) {
         this.mTotalPriceLabel = totalPriceLabel;
         this.mTitle = title;
         this.mImageUrl = imageUrl;
+        this.mShowAttribution = showAttribution;
         this.mShowImagePlaceholder = showImagePlaceholder;
         this.mTotalPrice = totalPrice;
         this.mDate = date;
@@ -75,6 +78,10 @@
         return mImageUrl;
     }
 
+    boolean getShowAttribution() {
+        return mShowAttribution;
+    }
+
     boolean getShowImagePlaceholder() {
         return mShowImagePlaceholder;
     }
@@ -124,7 +131,7 @@
      * Create details with the given values.
      */
     @CalledByNative
-    private static AssistantDetails create(String title, String imageUrl,
+    private static AssistantDetails create(String title, String imageUrl, boolean showAttribution,
             boolean showImagePlaceholder, String totalPriceLabel, String totalPrice,
             String datetime, long year, int month, int day, int hour, int minute, int second,
             String descriptionLine1, String descriptionLine2, boolean userApprovalRequired,
@@ -148,8 +155,9 @@
             }
         }
 
-        return new AssistantDetails(title, imageUrl, showImagePlaceholder, totalPriceLabel,
-                totalPrice, date, descriptionLine1, descriptionLine2, userApprovalRequired,
-                highlightTitle, highlightLine1, highlightLine2, animatePlaceholders);
+        return new AssistantDetails(title, imageUrl, showAttribution, showImagePlaceholder,
+                totalPriceLabel, totalPrice, date, descriptionLine1, descriptionLine2,
+                userApprovalRequired, highlightTitle, highlightLine1, highlightLine2,
+                animatePlaceholders);
     }
 }
diff --git a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java
index 0cb663c9..3dacadd 100644
--- a/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java
+++ b/chrome/android/features/autofill_assistant/java/src/org/chromium/chrome/browser/autofill_assistant/details/AssistantDetailsViewBinder.java
@@ -160,10 +160,7 @@
                     CachedImageFetcher.ASSISTANT_DETAILS_UMA_CLIENT_NAME, image -> {
                         if (image != null) {
                             viewHolder.mImageView.setImageDrawable(getRoundedImage(image));
-                            // TODO(wuandy): Actually pull 'showAttribution' from server response,
-                            // once it is ready.
-                            boolean showAttribution = false;
-                            if (showAttribution) {
+                            if (details.getShowAttribution()) {
                                 viewHolder.mImageView.setOnClickListener(unusedView
                                         -> onImageClicked(mContext, details.getImageUrl()));
                             } else {
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
index 277d5684..50f9574 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantUiTest.java
@@ -168,6 +168,7 @@
                         -> assistantCoordinator.getModel().getDetailsModel().set(
                                 AssistantDetailsModel.DETAILS,
                                 new AssistantDetails(movieTitle, /* imageUrl = */ "",
+                                        /* showAttribution = */ false,
                                         /* showImage = */ false,
                                         /* totalPriceLabel = */ "",
                                         /* totalPrice = */ "", Calendar.getInstance().getTime(),
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java
index b3951d6..62fe1a9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryBridge.java
@@ -87,10 +87,7 @@
         assert mContext != null;
         if (mContext instanceof ChromeActivity) {
             mManualFillingCoordinator = ((ChromeActivity) mContext).getManualFillingController();
-            if (mManualFillingCoordinator.getKeyboardAccessory() != null) {
-                mManualFillingCoordinator.getKeyboardAccessory().registerAutofillProvider(
-                        mChipProvider, this);
-            }
+            mManualFillingCoordinator.registerAutofillProvider(mChipProvider, this);
         }
 
         mNativeAutofillKeyboardAccessory = nativeAutofillKeyboardAccessory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
index 894ec36..869b314 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingCoordinator.java
@@ -4,7 +4,6 @@
 
 package org.chromium.chrome.browser.autofill.keyboard_accessory;
 
-import android.support.annotation.Nullable;
 import android.view.View;
 import android.view.ViewStub;
 
@@ -14,9 +13,9 @@
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
-import org.chromium.ui.DeferredViewStubInflationProvider;
+import org.chromium.components.autofill.AutofillDelegate;
+import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.DropdownPopupWindow;
-import org.chromium.ui.ViewProvider;
 import org.chromium.ui.base.WindowAndroid;
 
 /**
@@ -42,15 +41,14 @@
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
             barStub.setLayoutResource(org.chromium.chrome.R.layout.keyboard_accessory_modern);
         }
-        initialize(windowAndroid, new DeferredViewStubInflationProvider<>(barStub),
-                new DeferredViewStubInflationProvider<>(sheetStub));
+        initialize(windowAndroid, new KeyboardAccessoryCoordinator(mMediator, barStub),
+                new AccessorySheetCoordinator(sheetStub));
     }
 
     @VisibleForTesting
-    void initialize(WindowAndroid windowAndroid, ViewProvider<View> barProvider,
-            ViewProvider<View> sheetProvider) {
-        mMediator.initialize(new KeyboardAccessoryCoordinator(mMediator, barProvider),
-                new AccessorySheetCoordinator(sheetProvider), windowAndroid);
+    void initialize(WindowAndroid windowAndroid, KeyboardAccessoryCoordinator accessoryBar,
+            AccessorySheetCoordinator accessorySheet) {
+        mMediator.initialize(accessoryBar, accessorySheet, windowAndroid);
     }
 
     /**
@@ -87,14 +85,14 @@
      * Requests to close the active tab in the keyboard accessory. If there is no active tab, this
      * is a NoOp.
      */
-    public void closeAccessorySheet() {
+    void closeAccessorySheet() {
         mMediator.onCloseAccessorySheet();
     }
 
     /**
      * Opens the keyboard which implicitly dismisses the sheet. Without open sheet, this is a NoOp.
      */
-    public void swapSheetWithKeyboard() {
+    void swapSheetWithKeyboard() {
         mMediator.swapSheetWithKeyboard();
     }
 
@@ -111,7 +109,12 @@
         mMediator.registerCreditCardProvider();
     }
 
-    public void showWhenKeyboardIsVisible() {
+    void registerAutofillProvider(
+            PropertyProvider<AutofillSuggestion[]> autofillProvider, AutofillDelegate delegate) {
+        mMediator.registerAutofillProvider(autofillProvider, delegate);
+    }
+
+    void showWhenKeyboardIsVisible() {
         mMediator.showWhenKeyboardIsVisible();
     }
 
@@ -137,21 +140,6 @@
         return mMediator.getKeyboardExtensionSizeManager();
     }
 
-    // TODO(fhorschig): Should be @VisibleForTesting.
-    /**
-     * Allows access to the keyboard accessory. This can be used to explicitly modify the the bar of
-     * the keyboard accessory (e.g. by providing suggestions or actions).
-     * @return The coordinator of the Keyboard accessory component.
-     */
-    public @Nullable KeyboardAccessoryCoordinator getKeyboardAccessory() {
-        return mMediator.getKeyboardAccessory();
-    }
-
-    @VisibleForTesting
-    public ManualFillingMediator getMediatorForTesting() {
-        return mMediator;
-    }
-
     /**
      * Returns whether the Keyboard is replaced by an accessory sheet or is about to do so.
      * @return True if an accessory sheet is (being) opened and replacing the keyboard.
@@ -160,4 +148,9 @@
     public boolean isFillingViewShown(View view) {
         return mMediator.isFillingViewShown(view);
     }
+
+    @VisibleForTesting
+    ManualFillingMediator getMediatorForTesting() {
+        return mMediator;
+    }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
index 9e8bc8b3..d64925b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingMediator.java
@@ -42,6 +42,8 @@
 import org.chromium.chrome.browser.tab.TabObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelObserver;
 import org.chromium.chrome.browser.tabmodel.TabModelSelectorTabModelObserver;
+import org.chromium.components.autofill.AutofillDelegate;
+import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.DropdownPopupWindow;
 import org.chromium.ui.base.WindowAndroid;
@@ -55,7 +57,7 @@
  * This part of the manual filling component manages the state of the manual filling flow depending
  * on the currently shown tab.
  */
-public class ManualFillingMediator extends EmptyTabObserver
+class ManualFillingMediator extends EmptyTabObserver
         implements KeyboardAccessoryCoordinator.VisibilityDelegate, View.OnLayoutChangeListener {
     static private final int MINIMAL_AVAILABLE_VERTICAL_SPACE = 80; // in DP.
     static private final int MINIMAL_AVAILABLE_HORIZONTAL_SPACE = 180; // in DP.
@@ -174,6 +176,12 @@
         if (accessorySheet == null) return;
     }
 
+    void registerAutofillProvider(
+            PropertyProvider<AutofillSuggestion[]> autofillProvider, AutofillDelegate delegate) {
+        if (mKeyboardAccessory == null) return;
+        mKeyboardAccessory.registerAutofillProvider(autofillProvider, delegate);
+    }
+
     void registerActionProvider(PropertyProvider<Action[]> actionProvider) {
         if (!isInitialized()) return;
         ManualFillingState state = mStateCache.getStateFor(mActivity.getCurrentWebContents());
@@ -249,7 +257,7 @@
         return mKeyboardExtensionSizeManager;
     }
 
-    public void onPropertyChanged(PropertyObservable<PropertyKey> source, PropertyKey property) {
+    private void onPropertyChanged(PropertyObservable<PropertyKey> source, PropertyKey property) {
         assert source == mModel;
         if (property == SHOW_WHEN_VISIBLE) {
             if (!mModel.get(SHOW_WHEN_VISIBLE)) {
@@ -474,7 +482,8 @@
      * @return A {@link PasswordAccessorySheetCoordinator} or null if unavailable.
      */
     @VisibleForTesting
-    public @Nullable PasswordAccessorySheetCoordinator getOrCreatePasswordSheet() {
+    @Nullable
+    PasswordAccessorySheetCoordinator getOrCreatePasswordSheet() {
         if (!isInitialized()) return null;
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.EXPERIMENTAL_UI)
                 && !ChromeFeatureList.isEnabled(ChromeFeatureList.PASSWORDS_KEYBOARD_ACCESSORY)) {
@@ -525,7 +534,7 @@
         mInsetObserverViewSupplier = insetObserverViewSupplier;
     }
 
-    // TODO(fhorschig): Should be @VisibleForTesting.
+    @VisibleForTesting
     @Nullable
     KeyboardAccessoryCoordinator getKeyboardAccessory() {
         return mKeyboardAccessory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java
index 2bcc4812..52f4303 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingState.java
@@ -69,14 +69,14 @@
         mWebContents.addObserver(mWebContentsObserver);
     }
 
-    public KeyboardAccessoryData.Tab[] getTabs() {
+    KeyboardAccessoryData.Tab[] getTabs() {
         ArrayList<KeyboardAccessoryData.Tab> tabs = new ArrayList<>();
         if (mPasswordAccessorySheet != null) tabs.add(mPasswordAccessorySheet.getTab());
         if (mCreditCardAccessorySheet != null) tabs.add(mCreditCardAccessorySheet.getTab());
         return tabs.toArray(new KeyboardAccessoryData.Tab[0]);
     }
 
-    public void destroy() {
+    void destroy() {
         if (mWebContents != null) mWebContents.removeObserver(mWebContentsObserver);
         mActionsProvider = null;
         mPasswordSheetDataProvider = null;
@@ -90,7 +90,7 @@
      * @param provider A {@link PropertyProvider} providing actions.
      * @param defaultActions A default set of actions to prepopulate the adapter's cache.
      */
-    public void wrapActionsProvider(PropertyProvider<KeyboardAccessoryData.Action[]> provider,
+    void wrapActionsProvider(PropertyProvider<KeyboardAccessoryData.Action[]> provider,
             KeyboardAccessoryData.Action[] defaultActions) {
         mActionsProvider = new CachedProviderAdapter<>(
                 provider, defaultActions, this::onAdapterReceivedNewData);
@@ -100,7 +100,7 @@
      * Returns the wrapped provider set with {@link #wrapActionsProvider}.
      * @return A {@link CachedProviderAdapter} wrapping a {@link PropertyProvider}.
      */
-    public Provider<KeyboardAccessoryData.Action[]> getActionsProvider() {
+    Provider<KeyboardAccessoryData.Action[]> getActionsProvider() {
         return mActionsProvider;
     }
 
@@ -108,7 +108,7 @@
      * Wraps the given provider for password data in a {@link CachedProviderAdapter} and stores it.
      * @param provider A {@link PropertyProvider} providing password sheet data.
      */
-    public void wrapPasswordSheetDataProvider(PropertyProvider<AccessorySheetData> provider) {
+    void wrapPasswordSheetDataProvider(PropertyProvider<AccessorySheetData> provider) {
         mPasswordSheetDataProvider =
                 new CachedProviderAdapter<>(provider, null, this::onAdapterReceivedNewData);
     }
@@ -117,23 +117,25 @@
      * Returns the wrapped provider set with {@link #wrapPasswordSheetDataProvider}.
      * @return A {@link CachedProviderAdapter} wrapping a {@link PropertyProvider}.
      */
-    public Provider<AccessorySheetData> getPasswordSheetDataProvider() {
+    Provider<AccessorySheetData> getPasswordSheetDataProvider() {
         return mPasswordSheetDataProvider;
     }
 
-    public void setPasswordAccessorySheet(@Nullable PasswordAccessorySheetCoordinator sheet) {
+    void setPasswordAccessorySheet(@Nullable PasswordAccessorySheetCoordinator sheet) {
         mPasswordAccessorySheet = sheet;
     }
 
-    public @Nullable PasswordAccessorySheetCoordinator getPasswordAccessorySheet() {
+    @Nullable
+    PasswordAccessorySheetCoordinator getPasswordAccessorySheet() {
         return mPasswordAccessorySheet;
     }
 
-    public void setCreditCardAccessorySheet(@Nullable CreditCardAccessorySheetCoordinator sheet) {
+    void setCreditCardAccessorySheet(@Nullable CreditCardAccessorySheetCoordinator sheet) {
         mCreditCardAccessorySheet = sheet;
     }
 
-    public @Nullable CreditCardAccessorySheetCoordinator getCreditCardAccessorySheet() {
+    @Nullable
+    CreditCardAccessorySheetCoordinator getCreditCardAccessorySheet() {
         return mCreditCardAccessorySheet;
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java
index 5b18fd4..b02b06b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingStateCache.java
@@ -37,7 +37,7 @@
      * @param tab A {@link Tab} for whose {@link WebContents} a state is needed.
      * @return A {@link ManualFillingState}. Never null.
      */
-    public ManualFillingState getStateFor(Tab tab) {
+    ManualFillingState getStateFor(Tab tab) {
         return getStateFor(tab.getWebContents());
     }
 
@@ -47,7 +47,7 @@
      * @param webContents {@link WebContents} for which a state is needed.
      * @return A {@link ManualFillingState}. Never null.
      */
-    public ManualFillingState getStateFor(@Nullable WebContents webContents) {
+    ManualFillingState getStateFor(@Nullable WebContents webContents) {
         if (webContents == null) {
             // If state is requested for destroyed or invalid WebContents, it returns a null object.
             return new ManualFillingState(null);
@@ -62,7 +62,7 @@
     /**
      * Destroys all held states and removes the held references to the WebContents they belong to.
      */
-    public void destroy() {
+    void destroy() {
         for (ManualFillingState userState : mStatesForWebContents.values()) userState.destroy();
         mStatesForWebContents.clear();
     }
@@ -71,7 +71,7 @@
      * @see #destroyStateFor(WebContents)
      * @param tab The tab whose WebContents are going to be destroyed.
      */
-    public void destroyStateFor(Tab tab) {
+    void destroyStateFor(Tab tab) {
         destroyStateFor(tab.getWebContents());
     }
 
@@ -79,7 +79,7 @@
      * Ensures a reference to WebContents isn't held longer than necessary so GC can collect it.
      * @param webContents The WebContents about to be destroyed and should not be held any longer.
      */
-    public void destroyStateFor(WebContents webContents) {
+    void destroyStateFor(WebContents webContents) {
         if (webContents != null) {
             getStateFor(webContents).destroy();
             mStatesForWebContents.remove(webContents);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
index 539afef..2010069a 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryCoordinator.java
@@ -9,7 +9,7 @@
 import android.support.annotation.Nullable;
 import android.support.annotation.Px;
 import android.support.v4.view.ViewPager;
-import android.view.View;
+import android.view.ViewStub;
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -20,6 +20,7 @@
 import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
+import org.chromium.ui.DeferredViewStubInflationProvider;
 import org.chromium.ui.ViewProvider;
 import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
 import org.chromium.ui.modelutil.ListModel;
@@ -35,8 +36,7 @@
  */
 public class KeyboardAccessoryCoordinator {
     private final KeyboardAccessoryMediator mMediator;
-    private final KeyboardAccessoryTabLayoutCoordinator mTabLayout =
-            new KeyboardAccessoryTabLayoutCoordinator();
+    private final KeyboardAccessoryTabLayoutCoordinator mTabLayout;
 
     /**
      * The keyboard accessory provides signals when to show or change the accessory sheet below it.
@@ -114,21 +114,32 @@
     /**
      * Initializes the component as soon as the native library is loaded by e.g. starting to listen
      * to keyboard visibility events.
+     * @param barStub A {@link ViewStub} for the accessory bar layout.
+     */
+    public KeyboardAccessoryCoordinator(VisibilityDelegate visibilityDelegate, ViewStub barStub) {
+        this(new KeyboardAccessoryTabLayoutCoordinator(), visibilityDelegate,
+                new DeferredViewStubInflationProvider<>(barStub));
+    }
+
+    /**
+     * Constructor that allows to mock the {@link DeferredViewStubInflationProvider}.
      * @param viewProvider A provider for the accessory.
      */
-    public KeyboardAccessoryCoordinator(
-            VisibilityDelegate visibilityDelegate, ViewProvider<View> viewProvider) {
+    @VisibleForTesting
+    public KeyboardAccessoryCoordinator(KeyboardAccessoryTabLayoutCoordinator tabLayout,
+            VisibilityDelegate visibilityDelegate,
+            ViewProvider<KeyboardAccessoryView> viewProvider) {
         PropertyModel model = KeyboardAccessoryProperties.defaultModelBuilder().build();
+        mTabLayout = tabLayout;
         mMediator = new KeyboardAccessoryMediator(model, visibilityDelegate,
                 mTabLayout.getTabSwitchingDelegate(), mTabLayout.getTabLayoutCallbacks());
         if (!ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
-            viewProvider.whenLoaded(barView -> {
-                mTabLayout.assignNewView(((KeyboardAccessoryView) barView).getTabLayout());
-            });
+            viewProvider.whenLoaded(barView -> mTabLayout.assignNewView(barView.getTabLayout()));
         }
 
         mTabLayout.setTabObserver(mMediator);
-        PropertyModelChangeProcessor.ViewBinder<PropertyModel, View, PropertyKey> viewBinder =
+        PropertyModelChangeProcessor
+                .ViewBinder<PropertyModel, KeyboardAccessoryView, PropertyKey> viewBinder =
                 KeyboardAccessoryViewBinder::bind;
         if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
             viewBinder = KeyboardAccessoryModernViewBinder::bind;
@@ -161,24 +172,6 @@
         mTabLayout.getTabSwitchingDelegate().closeActiveTab();
     }
 
-    /**
-     * A {@link KeyboardAccessoryData.Tab} passed into this function will be represented as item at
-     * the start of the accessory. It is meant to trigger various bottom sheets.
-     * @param tab The tab which contains representation data and links back to a bottom sheet.
-     */
-    void addTab(KeyboardAccessoryData.Tab tab) {
-        mTabLayout.getTabSwitchingDelegate().addTab(tab);
-    }
-
-    /**
-     * The {@link KeyboardAccessoryData.Tab} passed into this function will be completely removed
-     * from the accessory.
-     * @param tab The tab to be removed.
-     */
-    void removeTab(KeyboardAccessoryData.Tab tab) {
-        mTabLayout.getTabSwitchingDelegate().removeTab(tab);
-    }
-
     public void setTabs(KeyboardAccessoryData.Tab[] tabs) {
         mTabLayout.getTabSwitchingDelegate().setTabs(tabs);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
index b5e290e..d4eb130 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
@@ -48,7 +48,7 @@
  * prominently generating passwords) and lets the model know of these actions and which callback to
  * trigger when selecting them.
  */
-public class KeyboardAccessoryMediator
+class KeyboardAccessoryMediator
         implements ListObservable.ListObserver<Void>,
                    PropertyObservable.PropertyObserver<PropertyKey>, Provider.Observer<Action[]>,
                    KeyboardAccessoryTabLayoutCoordinator.AccessoryTabObserver {
@@ -82,7 +82,7 @@
      * @param delegate A {@link AutofillDelegate}.
      * @return A {@link Provider.Observer} accepting only {@link AutofillSuggestion}s.
      */
-    public Provider.Observer<AutofillSuggestion[]> createAutofillSuggestionsObserver(
+    Provider.Observer<AutofillSuggestion[]> createAutofillSuggestionsObserver(
             AutofillDelegate delegate) {
         return (@AccessoryAction int typeId, AutofillSuggestion[] suggestions) -> {
             assert typeId
@@ -182,11 +182,6 @@
         close();
     }
 
-    @VisibleForTesting
-    public PropertyModel getModelForTesting() {
-        return mModel;
-    }
-
     @Override
     public void onItemRangeInserted(ListObservable source, int index, int count) {
         assert source == mModel.get(BAR_ITEMS);
@@ -279,15 +274,20 @@
         mModel.set(VISIBLE, shouldShowAccessory());
     }
 
-    public void setBottomOffset(@Px int bottomOffset) {
+    void setBottomOffset(@Px int bottomOffset) {
         mModel.set(BOTTOM_OFFSET_PX, bottomOffset);
     }
 
-    public boolean isShown() {
+    boolean isShown() {
         return mModel.get(VISIBLE);
     }
 
-    public boolean hasActiveTab() {
+    boolean hasActiveTab() {
         return mModel.get(VISIBLE) && mTabSwitcher.getActiveTab() != null;
     }
+
+    @VisibleForTesting
+    PropertyModel getModelForTesting() {
+        return mModel;
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
index c237e15..bac5aee5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernView.java
@@ -21,7 +21,7 @@
  * The Accessory sitting above the keyboard and below the content area. It is used for autofill
  * suggestions and manual entry points assisting the user in filling forms.
  */
-public class KeyboardAccessoryModernView extends KeyboardAccessoryView {
+class KeyboardAccessoryModernView extends KeyboardAccessoryView {
     private ImageView mKeyboardToggle;
     private TextView mSheetTitle;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
index d344ab30..02d68a2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryModernViewBinder.java
@@ -28,7 +28,7 @@
  * the {@link KeyboardAccessoryViewBinder} which will modify the view accordingly.
  */
 class KeyboardAccessoryModernViewBinder {
-    public static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
+    static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
         switch (viewType) {
             case BarItem.Type.SUGGESTION:
                 return new BarItemChipViewHolder(parent);
@@ -81,7 +81,7 @@
         }
     }
 
-    public static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
+    static void bind(PropertyModel model, KeyboardAccessoryView view, PropertyKey propertyKey) {
         assert view instanceof KeyboardAccessoryModernView;
         KeyboardAccessoryModernView modernView = (KeyboardAccessoryModernView) view;
         boolean wasBound = KeyboardAccessoryViewBinder.bindInternal(model, modernView, propertyKey);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
index e40df67..9832caf1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
@@ -29,20 +29,18 @@
  * state changes, it notifies its listeners - like the {@link KeyboardAccessoryMediator} or a
  * ModelChangeProcessor.
  */
-public class KeyboardAccessoryProperties {
-    public static final ReadableObjectPropertyKey<ListModel<BarItem>> BAR_ITEMS =
+class KeyboardAccessoryProperties {
+    static final ReadableObjectPropertyKey<ListModel<BarItem>> BAR_ITEMS =
             new ReadableObjectPropertyKey<>("bar_items");
-    public static final WritableBooleanPropertyKey VISIBLE =
-            new WritableBooleanPropertyKey("visible");
-    public static final WritableIntPropertyKey BOTTOM_OFFSET_PX =
-            new WritableIntPropertyKey("offset");
-    public static final WritableObjectPropertyKey<String> SHEET_TITLE =
+    static final WritableBooleanPropertyKey VISIBLE = new WritableBooleanPropertyKey("visible");
+    static final WritableIntPropertyKey BOTTOM_OFFSET_PX = new WritableIntPropertyKey("offset");
+    static final WritableObjectPropertyKey<String> SHEET_TITLE =
             new WritableObjectPropertyKey<>("sheet_title");
-    public static final WritableBooleanPropertyKey KEYBOARD_TOGGLE_VISIBLE =
+    static final WritableBooleanPropertyKey KEYBOARD_TOGGLE_VISIBLE =
             new WritableBooleanPropertyKey("toggle_visible");
-    public static final WritableObjectPropertyKey<TabLayoutBarItem> TAB_LAYOUT_ITEM =
+    static final WritableObjectPropertyKey<TabLayoutBarItem> TAB_LAYOUT_ITEM =
             new WritableObjectPropertyKey<>("tab_layout_item");
-    public static final WritableObjectPropertyKey<Runnable> SHOW_KEYBOARD_CALLBACK =
+    static final WritableObjectPropertyKey<Runnable> SHOW_KEYBOARD_CALLBACK =
             new WritableObjectPropertyKey<>("keyboard_callback");
 
     static PropertyModel.Builder defaultModelBuilder() {
@@ -58,13 +56,13 @@
      * This class wraps data used in ViewHolders of the accessory bar's {@link RecyclerView}.
      * It can hold an {@link Action}s that defines a callback and a recording type.
      */
-    public static class BarItem {
+    static class BarItem {
         /**
          * This type is used to infer which type of view will represent this item.
          */
         @IntDef({Type.ACTION_BUTTON, Type.SUGGESTION, Type.TAB_LAYOUT})
         @Retention(RetentionPolicy.SOURCE)
-        public @interface Type {
+        @interface Type {
             int ACTION_BUTTON = 0;
             int SUGGESTION = 1;
             int TAB_LAYOUT = 2;
@@ -77,7 +75,7 @@
          * @param type A {@link Type}.
          * @param action An {@link Action}.
          */
-        public BarItem(@Type int type, @Nullable Action action) {
+        BarItem(@Type int type, @Nullable Action action) {
             mType = type;
             mAction = action;
         }
@@ -86,7 +84,8 @@
          * Returns the which type of view represents this item.
          * @return A {@link Type}.
          */
-        public @Type int getViewType() {
+        @Type
+        int getViewType() {
             return mType;
         }
 
@@ -94,7 +93,8 @@
          * If applicable, returns which action is held by this item.
          * @return An {@link Action}.
          */
-        public @Nullable Action getAction() {
+        @Nullable
+        Action getAction() {
             return mAction;
         }
 
@@ -119,7 +119,7 @@
      * This {@link BarItem} is used to render Autofill suggestions into the accessory bar.
      * For that, it needs (in addition to an {@link Action}) the held {@link AutofillSuggestion}.
      */
-    public static class AutofillBarItem extends BarItem {
+    static class AutofillBarItem extends BarItem {
         private final AutofillSuggestion mSuggestion;
 
         /**
@@ -128,12 +128,12 @@
          * @param suggestion An {@link AutofillSuggestion}.
          * @param action An {@link Action}.
          */
-        public AutofillBarItem(AutofillSuggestion suggestion, Action action) {
+        AutofillBarItem(AutofillSuggestion suggestion, Action action) {
             super(Type.SUGGESTION, action);
             mSuggestion = suggestion;
         }
 
-        public AutofillSuggestion getSuggestion() {
+        AutofillSuggestion getSuggestion() {
             return mSuggestion;
         }
 
@@ -148,19 +148,19 @@
      * scrolled out of/into view. This wrapper allows to trigger a callback whenever the view is
      * recreated so it can be bound to its component.
      */
-    public static final class TabLayoutBarItem extends BarItem {
+    static final class TabLayoutBarItem extends BarItem {
         private final TabLayoutCallbacks mTabLayoutCallbacks;
 
-        public TabLayoutBarItem(TabLayoutCallbacks tabLayoutCallbacks) {
+        TabLayoutBarItem(TabLayoutCallbacks tabLayoutCallbacks) {
             super(Type.TAB_LAYOUT, null);
             mTabLayoutCallbacks = tabLayoutCallbacks;
         }
 
-        public void notifyAboutViewCreation(TabLayout tabs) {
+        void notifyAboutViewCreation(TabLayout tabs) {
             mTabLayoutCallbacks.onTabLayoutBound(tabs);
         }
 
-        public void notifyAboutViewDestruction(TabLayout tabs) {
+        void notifyAboutViewDestruction(TabLayout tabs) {
             mTabLayoutCallbacks.onTabLayoutUnbound(tabs);
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java
index fb1452a2..080aa1f 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryView.java
@@ -24,7 +24,7 @@
  * The Accessory sitting above the keyboard and below the content area. It is used for autofill
  * suggestions and manual entry points assisting the user in filling forms.
  */
-public class KeyboardAccessoryView extends LinearLayout {
+class KeyboardAccessoryView extends LinearLayout {
     protected RecyclerView mBarItemsView;
     protected TabLayout mTabLayout;
 
@@ -81,14 +81,14 @@
         setSoundEffectsEnabled(false);
     }
 
-    public TabLayout getTabLayout() {
+    TabLayout getTabLayout() {
         if (mTabLayout == null) {
             mTabLayout = findViewById(R.id.tabs);
         }
         return mTabLayout;
     }
 
-    public void setVisible(boolean visible) {
+    void setVisible(boolean visible) {
         if (!visible || getVisibility() != VISIBLE) mBarItemsView.scrollToPosition(0);
         if (visible) {
             show();
@@ -97,7 +97,7 @@
         }
     }
 
-    public void setBottomOffset(int bottomOffset) {
+    void setBottomOffset(int bottomOffset) {
         MarginLayoutParams params = (MarginLayoutParams) getLayoutParams();
         params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, bottomOffset);
         setLayoutParams(params);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
index df24b5d..9acdc6c 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
@@ -32,7 +32,7 @@
  * the {@link KeyboardAccessoryViewBinder} which will modify the view accordingly.
  */
 class KeyboardAccessoryViewBinder {
-    public static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
+    static BarItemViewHolder create(ViewGroup parent, @BarItem.Type int viewType) {
         switch (viewType) {
             case BarItem.Type.ACTION_BUTTON:
                 return new BarItemTextViewHolder(parent, R.layout.keyboard_accessory_action);
@@ -83,8 +83,8 @@
         }
     }
 
-    public static void bind(PropertyModel model, View view, PropertyKey propertyKey) {
-        boolean wasBound = bindInternal(model, (KeyboardAccessoryView) view, propertyKey);
+    static void bind(PropertyModel model, KeyboardAccessoryView view, PropertyKey propertyKey) {
+        boolean wasBound = bindInternal(model, view, propertyKey);
         assert wasBound : "Every possible property update needs to be handled!";
         requestLayoutPreKitkat(view);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
index db19bd1f..050ed5ae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetCoordinator.java
@@ -17,10 +17,11 @@
 import android.support.v4.view.PagerAdapter;
 import android.support.v4.view.ViewPager;
 import android.support.v7.widget.RecyclerView;
-import android.view.View;
+import android.view.ViewStub;
 
 import org.chromium.base.VisibleForTesting;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
+import org.chromium.ui.DeferredViewStubInflationProvider;
 import org.chromium.ui.ViewProvider;
 import org.chromium.ui.modelutil.LazyConstructionPropertyMcp;
 import org.chromium.ui.modelutil.ListModel;
@@ -39,9 +40,18 @@
     /**
      * Creates the sheet component by instantiating Model, View and Controller before wiring these
      * parts up.
-     * @param viewProvider A provider for the accessory layout.
+     * @param sheetStub A {@link ViewStub} for the accessory sheet layout.
      */
-    public AccessorySheetCoordinator(ViewProvider<View> viewProvider) {
+    public AccessorySheetCoordinator(ViewStub sheetStub) {
+        this(new DeferredViewStubInflationProvider<>(sheetStub));
+    }
+
+    /**
+     * Constructor that allows to mock the {@link DeferredViewStubInflationProvider}.
+     * @param viewProvider A provider for the accessory.
+     */
+    @VisibleForTesting
+    AccessorySheetCoordinator(ViewProvider<AccessorySheetView> viewProvider) {
         PropertyModel model = new PropertyModel
                                       .Builder(TABS, ACTIVE_TAB_INDEX, VISIBLE, HEIGHT,
                                               TOP_SHADOW_VISIBLE, PAGE_CHANGE_LISTENER)
@@ -72,19 +82,6 @@
         return adapter;
     }
 
-    /**
-     * Adds the contents of a given {@link KeyboardAccessoryData.Tab} to the accessory sheet. If it
-     * is the first Tab, it automatically becomes the active Tab.
-     * @param tab The tab which should be added to the AccessorySheet.
-     */
-    void addTab(KeyboardAccessoryData.Tab tab) {
-        mMediator.addTab(tab);
-    }
-
-    void removeTab(KeyboardAccessoryData.Tab tab) {
-        mMediator.removeTab(tab);
-    }
-
     public void setTabs(KeyboardAccessoryData.Tab[] tabs) {
         mMediator.setTabs(tabs);
     }
@@ -140,11 +137,6 @@
         return mMediator.isShown();
     }
 
-    @VisibleForTesting
-    public AccessorySheetMediator getMediatorForTesting() {
-        return mMediator;
-    }
-
     /**
      * Calling this function changes the active tab to the tab at the given |position|.
      * @param position The index of the tab (starting with 0) that should be set active.
@@ -156,4 +148,9 @@
     public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) {
         mMediator.setOnPageChangeListener(onPageChangeListener);
     }
+
+    @VisibleForTesting
+    AccessorySheetMediator getMediatorForTesting() {
+        return mMediator;
+    }
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java
index 9459a8e2..39ca66e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetMediator.java
@@ -27,7 +27,7 @@
  * It communicates with data providers and native backends to update a model based on {@link
  * AccessorySheetProperties}.
  */
-public class AccessorySheetMediator implements PropertyObservable.PropertyObserver<PropertyKey> {
+class AccessorySheetMediator implements PropertyObservable.PropertyObserver<PropertyKey> {
     private final PropertyModel mModel;
     private final RecyclerView.OnScrollListener mScrollListener =
             new RecyclerView.OnScrollListener() {
@@ -50,7 +50,7 @@
     }
 
     @VisibleForTesting
-    public PropertyModel getModelForTesting() {
+    PropertyModel getModelForTesting() {
         return mModel;
     }
 
@@ -62,7 +62,8 @@
         mModel.set(AccessorySheetProperties.HEIGHT, height);
     }
 
-    public @Px int getHeight() {
+    @Px
+    int getHeight() {
         return mModel.get(AccessorySheetProperties.HEIGHT);
     }
 
@@ -78,20 +79,6 @@
         return mScrollListener;
     }
 
-    void addTab(KeyboardAccessoryData.Tab tab) {
-        mModel.get(TABS).add(tab);
-        if (mModel.get(ACTIVE_TAB_INDEX) == NO_ACTIVE_TAB) {
-            mModel.set(ACTIVE_TAB_INDEX, mModel.get(TABS).size() - 1);
-        }
-    }
-
-    void removeTab(KeyboardAccessoryData.Tab tab) {
-        assert mModel.get(ACTIVE_TAB_INDEX) != NO_ACTIVE_TAB;
-        mModel.set(ACTIVE_TAB_INDEX, getNextActiveTab(tab));
-        mModel.get(TABS).remove(tab);
-        if (mModel.get(ACTIVE_TAB_INDEX) == NO_ACTIVE_TAB) hide();
-    }
-
     void setTabs(KeyboardAccessoryData.Tab[] tabs) {
         mModel.get(TABS).set(tabs);
         mModel.set(ACTIVE_TAB_INDEX, mModel.get(TABS).size() - 1);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java
index 6bc8dc0..e3ee9fc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetProperties.java
@@ -18,20 +18,18 @@
  * It is updated by the {@link AccessorySheetMediator} and emits notification on which observers
  * like the view binder react.
  */
-public class AccessorySheetProperties {
-    public static final ReadableObjectPropertyKey<ListModel<Tab>> TABS =
-            new ReadableObjectPropertyKey<>();
-    public static final WritableIntPropertyKey ACTIVE_TAB_INDEX =
+class AccessorySheetProperties {
+    static final ReadableObjectPropertyKey<ListModel<Tab>> TABS = new ReadableObjectPropertyKey<>();
+    static final WritableIntPropertyKey ACTIVE_TAB_INDEX =
             new WritableIntPropertyKey("active_tab_index");
-    public static final WritableBooleanPropertyKey VISIBLE =
-            new WritableBooleanPropertyKey("visible");
-    public static final WritableIntPropertyKey HEIGHT = new WritableIntPropertyKey("height");
-    public static final WritableBooleanPropertyKey TOP_SHADOW_VISIBLE =
+    static final WritableBooleanPropertyKey VISIBLE = new WritableBooleanPropertyKey("visible");
+    static final WritableIntPropertyKey HEIGHT = new WritableIntPropertyKey("height");
+    static final WritableBooleanPropertyKey TOP_SHADOW_VISIBLE =
             new WritableBooleanPropertyKey("top_shadow_visible");
-    public static final WritableObjectPropertyKey<ViewPager.OnPageChangeListener>
-            PAGE_CHANGE_LISTENER = new WritableObjectPropertyKey<>("page_change_listener");
+    static final WritableObjectPropertyKey<ViewPager.OnPageChangeListener> PAGE_CHANGE_LISTENER =
+            new WritableObjectPropertyKey<>("page_change_listener");
 
-    public static final int NO_ACTIVE_TAB = -1;
+    static final int NO_ACTIVE_TAB = -1;
 
     private AccessorySheetProperties() {}
 }
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java
index ddaa90f4..a7154ef 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetView.java
@@ -17,7 +17,7 @@
 /**
  * Displays the data provided by the {@link AccessorySheetViewBinder}.
  */
-public class AccessorySheetView extends FrameLayout {
+class AccessorySheetView extends FrameLayout {
     private ViewPager mViewPager;
     private ImageView mTopShadow;
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
index f0f701e..48b6367 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetViewBinder.java
@@ -26,7 +26,7 @@
  * {@link AccessorySheetViewBinder} which will modify the view accordingly.
  */
 class AccessorySheetViewBinder {
-    public static void bind(PropertyModel model, View sheetView, PropertyKey propertyKey) {
+    static void bind(PropertyModel model, View sheetView, PropertyKey propertyKey) {
         AccessorySheetView view = (AccessorySheetView) sheetView;
         if (propertyKey == TABS) {
             view.setAdapter(AccessorySheetCoordinator.createTabViewAdapter(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
index bf6fa7f1..0e18239 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabModel.java
@@ -17,17 +17,16 @@
  * This class describes the {@link ListModel} used for keyboard accessory sheets like the
  * {@link PasswordAccessorySheetCoordinator}.
  */
-public class AccessorySheetTabModel
-        extends ListModel<AccessorySheetTabModel.AccessorySheetDataPiece> {
+class AccessorySheetTabModel extends ListModel<AccessorySheetTabModel.AccessorySheetDataPiece> {
     /**
      * The {@link AccessorySheetData} has to be mapped to single items in a {@link RecyclerView}.
      * This class allows wrapping the {@link AccessorySheetData} into small chunks that are
      * organized in a {@link ListModel}. A specific ViewHolder is defined for each piece.
      */
-    public static class AccessorySheetDataPiece {
+    static class AccessorySheetDataPiece {
         @IntDef({Type.TITLE, Type.PASSWORD_INFO, Type.FOOTER_COMMAND})
         @Retention(RetentionPolicy.SOURCE)
-        public @interface Type {
+        @interface Type {
             /**
              * An item in title style used to display text. Non-interactive.
              */
@@ -50,11 +49,11 @@
             mType = type;
         }
 
-        public static int getType(AccessorySheetDataPiece accessorySheetDataPiece) {
+        static int getType(AccessorySheetDataPiece accessorySheetDataPiece) {
             return accessorySheetDataPiece.mType;
         }
 
-        public Object getDataPiece() {
+        Object getDataPiece() {
             return mDataPiece;
         }
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
index d7ae5636..23b8ecdb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetCoordinator.java
@@ -128,7 +128,7 @@
     }
 
     @VisibleForTesting
-    public AccessorySheetTabModel getSheetDataPiecesForTesting() {
+    AccessorySheetTabModel getSheetDataPiecesForTesting() {
         return mModel;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
index 3cdd56aa..9b5e8d522 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewBinder.java
@@ -152,7 +152,7 @@
         }
     }
 
-    public static void initializeView(RecyclerView view, AccessorySheetTabModel model) {
+    static void initializeView(RecyclerView view, AccessorySheetTabModel model) {
         view.setAdapter(PasswordAccessorySheetCoordinator.createAdapter(model));
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
index fc516366..d8acb8f89 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutCoordinator.java
@@ -177,17 +177,12 @@
     }
 
     @VisibleForTesting
-    public PropertyModel getModelForTesting() {
+    PropertyModel getModelForTesting() {
         return mModel;
     }
 
     @VisibleForTesting
-    public void setActiveTabForTesting(Integer newActiveTab) {
-        mModel.set(ACTIVE_TAB, newActiveTab);
-    }
-
-    @VisibleForTesting
-    public KeyboardAccessoryTabLayoutMediator getMediatorForTesting() {
+    KeyboardAccessoryTabLayoutMediator getMediatorForTesting() {
         return mMediator;
     }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
index cbed762..853daf0 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutMediator.java
@@ -150,16 +150,15 @@
         }
     }
 
-    public void setTabObserver(AccessoryTabObserver accessoryTabObserver) {
+    void setTabObserver(AccessoryTabObserver accessoryTabObserver) {
         mAccessoryTabObserver = accessoryTabObserver;
     }
 
-    public void addPageChangeListener(TabLayout.TabLayoutOnPageChangeListener pageChangeListener) {
+    void addPageChangeListener(TabLayout.TabLayoutOnPageChangeListener pageChangeListener) {
         mPageChangeListeners.add(pageChangeListener);
     }
 
-    public void removePageChangeListener(
-            TabLayout.TabLayoutOnPageChangeListener pageChangeListener) {
+    void removePageChangeListener(TabLayout.TabLayoutOnPageChangeListener pageChangeListener) {
         mPageChangeListeners.remove(pageChangeListener);
     }
 
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
index fd78cacd..aabf68e1b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutProperties.java
@@ -15,10 +15,10 @@
  * These properties are used to describe a model for the tab layout component as used in the
  * keyboard accessory. The properties are describing all known tabs.
  */
-public class KeyboardAccessoryTabLayoutProperties {
-    public static final ReadableObjectPropertyKey<ListModel<KeyboardAccessoryData.Tab>> TABS =
+class KeyboardAccessoryTabLayoutProperties {
+    static final ReadableObjectPropertyKey<ListModel<KeyboardAccessoryData.Tab>> TABS =
             new ReadableObjectPropertyKey<>("tabs");
-    public static final /* @Nullable */ WritableObjectPropertyKey<Integer> ACTIVE_TAB =
+    static final WritableObjectPropertyKey<Integer> ACTIVE_TAB =
             new WritableObjectPropertyKey<>("active_tab");
     static final WritableObjectPropertyKey<TabLayout.OnTabSelectedListener>
             TAB_SELECTION_CALLBACKS = new WritableObjectPropertyKey<>("tab_selection_callback");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
index c4058cbf9..cf29eaae 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutView.java
@@ -17,7 +17,7 @@
 /**
  * A {@link TabLayout} containing the tabs in the keyboard accessory.
  */
-public class KeyboardAccessoryTabLayoutView extends TabLayout {
+class KeyboardAccessoryTabLayoutView extends TabLayout {
     /**
      * Constructor for inflating from XML.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManageSyncPreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManageSyncPreferences.java
index 9007801f7..faad1c2d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManageSyncPreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/ManageSyncPreferences.java
@@ -8,8 +8,6 @@
 import android.app.FragmentManager;
 import android.app.FragmentTransaction;
 import android.content.Context;
-import android.content.Intent;
-import android.net.Uri;
 import android.os.Bundle;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
@@ -71,8 +69,6 @@
     private static final String PREF_ENCRYPTION = "encryption";
     private static final String PREF_SYNC_MANAGE_DATA = "sync_manage_data";
 
-    private static final String DASHBOARD_URL = "https://www.google.com/settings/chrome/sync";
-
     private final ProfileSyncService mProfileSyncService = ProfileSyncService.get();
 
     private ChromeSwitchPreference mSyncEverything;
@@ -119,7 +115,7 @@
                 SyncPreferenceUtils.toOnClickListener(this, this::onSyncEncryptionClicked));
         mManageSyncData = findPreference(PREF_SYNC_MANAGE_DATA);
         mManageSyncData.setOnPreferenceClickListener(SyncPreferenceUtils.toOnClickListener(
-                this, this::openDashboardTabInNewActivityStack));
+                this, () -> SyncPreferenceUtils.openSyncDashboard(getActivity())));
 
         mSyncTypePreferences =
                 new CheckBoxPreference[] {mSyncAutofill, mSyncBookmarks, mSyncPaymentsIntegration,
@@ -397,14 +393,6 @@
         }
     }
 
-    /** Opens the Google Dashboard where the user can control the data stored for the account. */
-    private void openDashboardTabInNewActivityStack() {
-        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(DASHBOARD_URL));
-        intent.setPackage(getActivity().getPackageName());
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        startActivity(intent);
-    }
-
     /**
      * Gets the current state of data types from {@link ProfileSyncService} and updates the UI.
      */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreferenceUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreferenceUtils.java
index c7e4f199..571aaeda 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreferenceUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SyncPreferenceUtils.java
@@ -3,19 +3,28 @@
 // found in the LICENSE file.
 package org.chromium.chrome.browser.preferences;
 
+import android.app.Activity;
 import android.content.Context;
+import android.content.Intent;
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
+import android.net.Uri;
 import android.preference.Preference;
 import android.preference.PreferenceFragment;
+import android.provider.Browser;
 import android.support.annotation.Nullable;
+import android.support.customtabs.CustomTabsIntent;
 
 import org.chromium.base.BuildInfo;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
+import org.chromium.chrome.browser.IntentHandler;
+import org.chromium.chrome.browser.LaunchIntentDispatcher;
+import org.chromium.chrome.browser.customtabs.CustomTabIntentDataProvider;
 import org.chromium.chrome.browser.sync.GoogleServiceAuthError;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
+import org.chromium.chrome.browser.util.IntentUtils;
 import org.chromium.components.signin.ChromeSigninController;
 import org.chromium.components.sync.AndroidSyncSettings;
 import org.chromium.components.sync.StopSource;
@@ -25,6 +34,8 @@
  * Helper methods for sync preferences.
  */
 public class SyncPreferenceUtils {
+    private static final String DASHBOARD_URL = "https://www.google.com/settings/chrome/sync";
+
     /**
      * Checks if sync error icon should be shown. Show sync error icon if sync is off because
      * of error, passphrase required or disabled in Android.
@@ -163,4 +174,25 @@
             return false;
         };
     }
+
+    /**
+     * Opens web dashboard to manage sync in a custom tab.
+     * @param activity The activity to use for starting the intent.
+     */
+    public static void openSyncDashboard(Activity activity) {
+        // TODO(https://crbug.com/948103): Create a builder for custom tab intents.
+        CustomTabsIntent customTabIntent =
+                new CustomTabsIntent.Builder().setShowTitle(false).build();
+        customTabIntent.intent.setData(Uri.parse(DASHBOARD_URL));
+
+        Intent intent = LaunchIntentDispatcher.createCustomTabActivityIntent(
+                activity, customTabIntent.intent);
+        intent.setPackage(activity.getPackageName());
+        intent.putExtra(CustomTabIntentDataProvider.EXTRA_UI_TYPE,
+                CustomTabIntentDataProvider.CustomTabsUiType.DEFAULT);
+        intent.putExtra(Browser.EXTRA_APPLICATION_ID, activity.getPackageName());
+        IntentHandler.addTrustedIntentExtras(intent);
+
+        IntentUtils.safeStartActivity(activity, intent);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
index 2595808..ee6b395 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/ConfirmSyncDataStateMachine.java
@@ -163,7 +163,7 @@
                     // This will call back into onConfirm() on success.
                     ConfirmManagedSyncDataDialog.showSwitchFromManagedAccountDialog(this,
                             mFragmentManager, mContext.getResources(),
-                            SigninManager.get().extractDomainName(mOldAccountName), mOldAccountName,
+                            SigninManager.extractDomainName(mOldAccountName), mOldAccountName,
                             mNewAccountName);
                 } else {
                     // This will call back into onConfirm(boolean wipeData) on success.
@@ -215,7 +215,7 @@
             // This will call back into onConfirm on success.
             ConfirmManagedSyncDataDialog.showSignInToManagedAccountDialog(
                     ConfirmSyncDataStateMachine.this, mFragmentManager, mContext.getResources(),
-                    SigninManager.get().extractDomainName(mNewAccountName));
+                    SigninManager.extractDomainName(mNewAccountName));
         } else {
             progress();
         }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
index 3f09eff..aef01ce1 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninManager.java
@@ -22,6 +22,8 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.VisibleForTesting;
 import org.chromium.base.annotations.CalledByNative;
+import org.chromium.base.annotations.JCaller;
+import org.chromium.base.annotations.NativeMethods;
 import org.chromium.base.metrics.RecordHistogram;
 import org.chromium.base.metrics.RecordUserAction;
 import org.chromium.base.task.PostTask;
@@ -241,8 +243,9 @@
         mAccountTrackerService = accountTrackerService;
         mAndroidSyncSettings = androidSyncSettings;
 
-        mNativeSigninManagerAndroid = nativeInit();
-        mSigninAllowedByPolicy = nativeIsSigninAllowedByPolicy(mNativeSigninManagerAndroid);
+        mNativeSigninManagerAndroid = SigninManagerJni.get().init(this);
+        mSigninAllowedByPolicy =
+                SigninManagerJni.get().isSigninAllowedByPolicy(this, mNativeSigninManagerAndroid);
 
         mAccountTrackerService.addSystemAccountsSeededListener(this);
     }
@@ -304,7 +307,7 @@
      * @return Whether force sign-in is enabled by policy.
      */
     public boolean isForceSigninEnabled() {
-        return nativeIsForceSigninEnabled(mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().isForceSigninEnabled(this, mNativeSigninManagerAndroid);
     }
 
     /**
@@ -442,7 +445,7 @@
             return;
         }
 
-        if (!nativeShouldLoadPolicyForUser(mSignInState.mAccount.name)) {
+        if (!SigninManagerJni.get().shouldLoadPolicyForUser(mSignInState.mAccount.name)) {
             // Proceed with the sign-in flow without checking for policy if it can be determined
             // that this account can't have management enabled based on the username.
             finishSignIn();
@@ -451,7 +454,8 @@
 
         Log.d(TAG, "Checking if account has policy management enabled");
         // This will call back to onPolicyCheckedBeforeSignIn.
-        nativeCheckPolicyBeforeSignIn(mNativeSigninManagerAndroid, mSignInState.mAccount.name);
+        SigninManagerJni.get().checkPolicyBeforeSignIn(
+                this, mNativeSigninManagerAndroid, mSignInState.mAccount.name);
     }
 
     @CalledByNative
@@ -472,7 +476,7 @@
 
         // The user has already been notified that they are signing into a managed account.
         // This will call back to onPolicyFetchedBeforeSignIn.
-        nativeFetchPolicyBeforeSignIn(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().fetchPolicyBeforeSignIn(this, mNativeSigninManagerAndroid);
     }
 
     @CalledByNative
@@ -487,7 +491,8 @@
         assert mSignInState != null;
 
         // Tell the native side that sign-in has completed.
-        nativeOnSignInCompleted(mNativeSigninManagerAndroid, mSignInState.mAccount.name);
+        SigninManagerJni.get().onSignInCompleted(
+                this, mNativeSigninManagerAndroid, mSignInState.mAccount.name);
 
         // Cache the signed-in account name. This must be done after the native call, otherwise
         // sync tries to start without being signed in natively and crashes.
@@ -603,23 +608,23 @@
         Log.d(TAG, "Signing out, management domain: " + mSignOutState.mManagementDomain);
 
         // User data will be wiped in resetAccountData(), called from onNativeSignOut().
-        nativeSignOut(mNativeSigninManagerAndroid, signoutSource);
+        SigninManagerJni.get().signOut(this, mNativeSigninManagerAndroid, signoutSource);
     }
 
     /**
      * Returns the management domain if the signed in account is managed, otherwise returns null.
      */
     public String getManagementDomain() {
-        return nativeGetManagementDomain(mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().getManagementDomain(this, mNativeSigninManagerAndroid);
     }
 
     @VisibleForTesting
     void logInSignedInUser() {
-        nativeLogInSignedInUser(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().logInSignedInUser(this, mNativeSigninManagerAndroid);
     }
 
     public void clearLastSignedInUser() {
-        nativeClearLastSignedInUser(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().clearLastSignedInUser(this, mNativeSigninManagerAndroid);
     }
 
     /**
@@ -638,7 +643,7 @@
             signInState.mCallback.onSignInAborted();
         }
 
-        nativeAbortSignIn(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().abortSignIn(this, mNativeSigninManagerAndroid);
 
         Log.d(TAG, "Signin flow aborted.");
         notifySignInAllowedChanged();
@@ -688,7 +693,7 @@
 
         if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.preWipeData();
         // This will call back to onProfileDataWiped().
-        nativeWipeProfileData(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().wipeProfileData(this, mNativeSigninManagerAndroid);
     }
 
     private void wipeGoogleServiceWorkerCaches() {
@@ -697,7 +702,7 @@
 
         if (mSignOutState.mWipeDataHooks != null) mSignOutState.mWipeDataHooks.preWipeData();
         // This will call back to onProfileDataWiped().
-        nativeWipeGoogleServiceWorkerCaches(mNativeSigninManagerAndroid);
+        SigninManagerJni.get().wipeGoogleServiceWorkerCaches(this, mNativeSigninManagerAndroid);
     }
 
     /**
@@ -741,7 +746,7 @@
      * @return Whether there is a signed in account on the native side.
      */
     public boolean isSignedInOnNative() {
-        return nativeIsSignedInOnNative(mNativeSigninManagerAndroid);
+        return SigninManagerJni.get().isSignedInOnNative(this, mNativeSigninManagerAndroid);
     }
 
     @CalledByNative
@@ -756,15 +761,11 @@
      *         otherwise. May be called synchronously from this function.
      */
     public void isUserManaged(String email, final Callback<Boolean> callback) {
-        if (nativeShouldLoadPolicyForUser(email)) {
-            nativeIsUserManaged(email, callback);
-        } else {
-            callback.onResult(false);
-        }
+        SigninManagerJni.get().isUserManaged(email, callback);
     }
 
-    public String extractDomainName(String email) {
-        return nativeExtractDomainName(email);
+    public static String extractDomainName(String email) {
+        return SigninManagerJni.get().extractDomainName(email);
     }
 
     @VisibleForTesting
@@ -773,38 +774,45 @@
     }
 
     // Native methods.
-    @VisibleForTesting
-    native long nativeInit();
-    @VisibleForTesting
-    native boolean nativeIsSigninAllowedByPolicy(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native boolean nativeIsForceSigninEnabled(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeCheckPolicyBeforeSignIn(long nativeSigninManagerAndroid, String username);
-    @VisibleForTesting
-    native void nativeFetchPolicyBeforeSignIn(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeAbortSignIn(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeOnSignInCompleted(long nativeSigninManagerAndroid, String username);
-    @VisibleForTesting
-    native void nativeSignOut(long nativeSigninManagerAndroid, @SignoutReason int reason);
-    @VisibleForTesting
-    native String nativeGetManagementDomain(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeWipeProfileData(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeWipeGoogleServiceWorkerCaches(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeClearLastSignedInUser(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native void nativeLogInSignedInUser(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native boolean nativeIsSignedInOnNative(long nativeSigninManagerAndroid);
-    @VisibleForTesting
-    native boolean nativeShouldLoadPolicyForUser(String username);
-    @VisibleForTesting
-    native void nativeIsUserManaged(String username, Callback<Boolean> callback);
-    @VisibleForTesting
-    native String nativeExtractDomainName(String email);
+    @NativeMethods
+    interface Natives {
+        long init(@JCaller SigninManager self);
+
+        boolean isSigninAllowedByPolicy(
+                @JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        boolean isForceSigninEnabled(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void checkPolicyBeforeSignIn(
+                @JCaller SigninManager self, long nativeSigninManagerAndroid, String username);
+
+        void fetchPolicyBeforeSignIn(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void abortSignIn(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void onSignInCompleted(
+                @JCaller SigninManager self, long nativeSigninManagerAndroid, String username);
+
+        void signOut(@JCaller SigninManager self, long nativeSigninManagerAndroid,
+                @SignoutReason int reason);
+
+        String getManagementDomain(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void wipeProfileData(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void wipeGoogleServiceWorkerCaches(
+                @JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void clearLastSignedInUser(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        void logInSignedInUser(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        boolean isSignedInOnNative(@JCaller SigninManager self, long nativeSigninManagerAndroid);
+
+        boolean shouldLoadPolicyForUser(String username);
+
+        void isUserManaged(String username, Callback<Boolean> callback);
+
+        String extractDomainName(String email);
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
index bca2cab..1706b6d2 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/ui/SyncCustomizationFragment.java
@@ -116,8 +116,6 @@
     private boolean mIsEngineInitialized;
     private boolean mIsPassphraseRequired;
 
-    private static final String DASHBOARD_URL = "https://www.google.com/settings/chrome/sync";
-
     private SwitchPreference mSyncEverything;
     private CheckBoxPreference mSyncAutofill;
     private CheckBoxPreference mSyncBookmarks;
@@ -503,7 +501,7 @@
                 return true;
             }
         } else if (preference == mManageSyncData) {
-            openDashboardTabInNewActivityStack();
+            SyncPreferenceUtils.openSyncDashboard(getActivity());
             return true;
         } else if (preference == mSyncErrorCard) {
             onSyncErrorCardClicked();
@@ -513,16 +511,6 @@
     }
 
     /**
-     * Opens the Google Dashboard where the user can control the data stored for the account.
-     */
-    private void openDashboardTabInNewActivityStack() {
-        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(DASHBOARD_URL));
-        intent.setPackage(getActivity().getPackageName());
-        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
-        startActivity(intent);
-    }
-
-    /**
      * Update the state of the sync everything switch.
      *
      * If sync is on, load the pref from native. Otherwise display sync everything as on but
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
index 1ab46976..603206ba 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
@@ -12,7 +12,6 @@
 
 import android.content.pm.ActivityInfo;
 import android.graphics.Point;
-import android.os.Build;
 import android.os.Debug;
 import android.os.SystemClock;
 import android.support.test.InstrumentationRegistry;
@@ -34,7 +33,6 @@
 import org.chromium.base.task.PostTask;
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
-import org.chromium.base.test.util.DisableIf;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
@@ -1466,6 +1464,7 @@
     @Feature({"Android-TabSwitcher"})
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
     @RetryOnFailure
+    @DisabledTest(message = "https://crbug.com/947694")
     public void testToolbarSwipeOnlyTab() throws InterruptedException, TimeoutException {
         final TabModel tabModel =
                 mActivityTestRule.getActivity().getTabModelSelector().getModel(false);
@@ -1535,11 +1534,8 @@
     @Feature({"Android-TabSwitcher"})
     @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE)
     @RetryOnFailure
-    @DisableIf.Build(message = "crbug.com/871554", supported_abis_includes = "arm64-v8a",
-            sdk_is_greater_than = Build.VERSION_CODES.LOLLIPOP_MR1,
-            sdk_is_less_than = Build.VERSION_CODES.N)
-    public void
-    testToolbarSwipeNextTabNone() throws InterruptedException, TimeoutException {
+    @DisabledTest(message = "https://crbug.com/947694")
+    public void testToolbarSwipeNextTabNone() throws InterruptedException, TimeoutException {
         ChromeTabUtils.newTabFromMenu(
                 InstrumentationRegistry.getInstrumentation(), mActivityTestRule.getActivity());
         UiUtils.settleDownUI(InstrumentationRegistry.getInstrumentation());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
index 49c552739..232a659a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
@@ -14,6 +14,7 @@
 import org.junit.runner.RunWith;
 
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
@@ -104,6 +105,7 @@
      */
     @Test
     @MediumTest
+    @DisabledTest(message = "https://crbug.com/947696")
     public void testSelectSuggestionHidesKeyboardAccessory()
             throws ExecutionException, InterruptedException, TimeoutException {
         loadTestPage();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java
index cc92fd00..b4d154b 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/FakeKeyboard.java
@@ -4,7 +4,7 @@
 
 package org.chromium.chrome.browser.autofill.keyboard_accessory;
 
-import static org.chromium.base.ThreadUtils.runOnUiThreadBlocking;
+import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking;
 
 import android.app.Activity;
 import android.content.Context;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
index 21836f5bd..17c4ea3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingIntegrationTest.java
@@ -9,7 +9,6 @@
 import static android.support.test.espresso.assertion.ViewAssertions.doesNotExist;
 import static android.support.test.espresso.assertion.ViewAssertions.matches;
 import static android.support.test.espresso.matcher.ViewMatchers.assertThat;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
 import static android.support.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
 import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static android.support.test.espresso.matcher.ViewMatchers.withChild;
@@ -24,6 +23,7 @@
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.waitToBeHidden;
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
 
 import android.support.test.espresso.Espresso;
 import android.support.test.filters.SmallTest;
@@ -43,7 +43,6 @@
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
 import org.chromium.chrome.browser.autofill.PersonalDataManager;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView;
 import org.chromium.chrome.browser.infobar.InfoBarIdentifier;
 import org.chromium.chrome.browser.infobar.SimpleConfirmInfoBarBuilder;
 import org.chromium.chrome.browser.snackbar.Snackbar;
@@ -94,6 +93,7 @@
         assertNotNull("Keyboard accessory should have an instance.",
                 mActivityTestRule.getActivity()
                         .getManualFillingController()
+                        .getMediatorForTesting()
                         .getKeyboardAccessory());
         assertNotNull("Accessory Sheet should have an instance.",
                 mActivityTestRule.getActivity()
@@ -149,7 +149,7 @@
         onView(withChild(withId(R.id.keyboard_accessory_sheet))).check(doesNotExist());
 
         // Trigger the sheet and wait for it to open and the keyboard to disappear.
-        onView(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        onView(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -175,7 +175,7 @@
         onView(withChild(withId(R.id.keyboard_accessory_sheet))).check(doesNotExist());
 
         // Trigger the sheet and wait for it to open and the keyboard to disappear.
-        onView(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        onView(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet))).check((view, e) -> {
@@ -203,13 +203,13 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
 
         // Click the tab again to hide the sheet and show the keyboard.
-        onView(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        onView(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardAccessoryToBeShown();
         onView(withId(R.id.keyboard_accessory)).check(matches(isDisplayed()));
@@ -237,7 +237,7 @@
         assertThat(popup.isShowing(), is(true));
 
         // Click the tab to show the sheet and hide keyboard and popup.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -255,7 +255,7 @@
         // Focus the password field to bring up the accessory.
         mHelper.focusPasswordField();
         mHelper.waitForKeyboardAccessoryToBeShown();
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)));
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()));
 
         // Clicking the email field hides the accessory again.
         mHelper.clickEmailField(false);
@@ -274,7 +274,7 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -298,7 +298,7 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -321,7 +321,7 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -338,7 +338,7 @@
         mHelper.waitForKeyboardAccessoryToBeShown();
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -413,7 +413,7 @@
         assertThat(mActivityTestRule.getInfoBarContainer().getVisibility(), is(not(View.VISIBLE)));
 
         // Click the tab to show the sheet and hide the keyboard.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         mHelper.waitForKeyboardToDisappear();
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
@@ -458,7 +458,7 @@
         onView(withText(kSnackbarText)).check(matches(isCompletelyDisplayed()));
 
         // Open a keyboard accessory sheet -- this also shouldn't hide the snackbar.
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
         onView(withText(kSnackbarText)).check(matches(isCompletelyDisplayed()));
@@ -489,7 +489,7 @@
         // Focus the field to bring up the accessory.
         mHelper.focusPasswordField();
         mHelper.waitForKeyboardAccessoryToBeShown();
-        whenDisplayed(allOf(isDisplayed(), isAssignableFrom(KeyboardAccessoryTabLayoutView.class)))
+        whenDisplayed(allOf(isDisplayed(), isKeyboardAccessoryTabLayout()))
                 .perform(selectTabAtPosition(0));
         whenDisplayed(withChild(withId(R.id.keyboard_accessory_sheet)));
         assertThat(mActivityTestRule.getInfoBarContainer().getVisibility(), is(not(View.VISIBLE)));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java
index a10d1f9..dbccab5 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingTestHelper.java
@@ -45,6 +45,7 @@
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
+import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
 import org.chromium.content_public.browser.ImeAdapter;
 import org.chromium.content_public.browser.UiThreadTaskTraits;
@@ -191,6 +192,7 @@
         CriteriaHelper.pollInstrumentationThread(() -> {
             KeyboardAccessoryCoordinator accessory = mActivityTestRule.getActivity()
                                                              .getManualFillingController()
+                                                             .getMediatorForTesting()
                                                              .getKeyboardAccessory();
             return accessory != null && !accessory.isShown();
         });
@@ -204,6 +206,7 @@
         CriteriaHelper.pollInstrumentationThread(() -> {
             KeyboardAccessoryCoordinator accessory = mActivityTestRule.getActivity()
                                                              .getManualFillingController()
+                                                             .getMediatorForTesting()
                                                              .getKeyboardAccessory();
             return accessory != null && accessory.isShown();
         });
@@ -246,6 +249,13 @@
         return popup;
     }
 
+    public PasswordAccessorySheetCoordinator getOrCreatePasswordAccessorySheet() {
+        return mActivityTestRule.getActivity()
+                .getManualFillingController()
+                .getMediatorForTesting()
+                .getOrCreatePasswordSheet();
+    }
+
     // ----------------------------------
     // Helpers to set up the native side.
     // ----------------------------------
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java
index d943e2f8..2c4a880 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingUiCaptureTest.java
@@ -7,7 +7,6 @@
 import static android.support.test.espresso.Espresso.onView;
 import static android.support.test.espresso.contrib.RecyclerViewActions.actionOnItem;
 import static android.support.test.espresso.contrib.RecyclerViewActions.scrollTo;
-import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
 import static android.support.test.espresso.matcher.ViewMatchers.withId;
 import static android.support.test.espresso.matcher.ViewMatchers.withParent;
 
@@ -15,6 +14,7 @@
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.scrollToLastElement;
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.selectTabAtPosition;
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingTestHelper.whenDisplayed;
+import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabTestHelper.isKeyboardAccessoryTabLayout;
 
 import android.support.test.filters.MediumTest;
 import android.support.v7.widget.RecyclerView;
@@ -30,7 +30,6 @@
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView;
 import org.chromium.chrome.browser.test.ScreenShooter;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.ChromeTabbedActivityTestRule;
@@ -139,9 +138,8 @@
         mScreenShooter.shoot("AccessoryBarV2");
 
         whenDisplayed(withId(R.id.bar_items_view))
-                .perform(scrollTo(isAssignableFrom(KeyboardAccessoryTabLayoutView.class)),
-                        actionOnItem(isAssignableFrom(KeyboardAccessoryTabLayoutView.class),
-                                selectTabAtPosition(0)));
+                .perform(scrollTo(isKeyboardAccessoryTabLayout()),
+                        actionOnItem(isKeyboardAccessoryTabLayout(), selectTabAtPosition(0)));
 
         waitForSuggestionsInSheet();
         waitForUnrelatedChromeUi();
@@ -171,9 +169,8 @@
         mScreenShooter.shoot("AccessoryBarV2RTL");
 
         whenDisplayed(withId(R.id.bar_items_view))
-                .perform(scrollTo(isAssignableFrom(KeyboardAccessoryTabLayoutView.class)),
-                        actionOnItem(isAssignableFrom(KeyboardAccessoryTabLayoutView.class),
-                                selectTabAtPosition(0)));
+                .perform(scrollTo(isKeyboardAccessoryTabLayout()),
+                        actionOnItem(isKeyboardAccessoryTabLayout(), selectTabAtPosition(0)));
 
         waitForSuggestionsInSheet();
         waitForUnrelatedChromeUi();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
index 031ee5b..c4bf29a 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
@@ -36,7 +36,6 @@
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.DeferredViewStubInflationProvider;
 import org.chromium.ui.modelutil.RecyclerViewAdapter;
 import org.chromium.ui.modelutil.SimpleRecyclerViewMcp;
 import org.chromium.ui.widget.TextViewWithLeading;
@@ -67,9 +66,8 @@
             @LayoutRes int layout, KeyboardAccessoryData.Tab.Listener listener) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             AccessorySheetCoordinator accessorySheet =
-                    new AccessorySheetCoordinator(new DeferredViewStubInflationProvider<>(
-                            mActivityTestRule.getActivity().findViewById(
-                                    R.id.keyboard_accessory_sheet_stub)));
+                    new AccessorySheetCoordinator(mActivityTestRule.getActivity().findViewById(
+                            R.id.keyboard_accessory_sheet_stub));
             accessorySheet.setTabs(new KeyboardAccessoryData.Tab[] {new KeyboardAccessoryData.Tab(
                     "Passwords", null, null, layout, AccessoryTabType.ALL, listener)});
             accessorySheet.setHeight(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
index 03c58b44..53a9c24 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessoryIntegrationTest.java
@@ -65,11 +65,7 @@
         mHelper.loadTestPage(false);
 
         CriteriaHelper.pollUiThread(()
-                                            -> mActivityTestRule.getActivity()
-                                                       .getManualFillingController()
-                                                       .getMediatorForTesting()
-                                                       .getOrCreatePasswordSheet()
-                        != null,
+                                            -> mHelper.getOrCreatePasswordAccessorySheet() != null,
                 "Password Sheet should be bound to accessory sheet.");
     }
 
@@ -80,11 +76,7 @@
         mHelper.loadTestPage(false);
 
         CriteriaHelper.pollUiThread(()
-                                            -> mActivityTestRule.getActivity()
-                                                       .getManualFillingController()
-                                                       .getMediatorForTesting()
-                                                       .getOrCreatePasswordSheet()
-                        != null,
+                                            -> mHelper.getOrCreatePasswordAccessorySheet() != null,
                 "Password Sheet should be bound to accessory sheet.");
     }
 
@@ -97,10 +89,7 @@
         mHelper.loadTestPage(false);
 
         Assert.assertNull("Password Sheet should not have been created.",
-                mActivityTestRule.getActivity()
-                        .getManualFillingController()
-                        .getMediatorForTesting()
-                        .getOrCreatePasswordSheet());
+                mHelper.getOrCreatePasswordAccessorySheet());
     }
 
     @Test
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
index c9ade50b..1a0c1220 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetModernViewTest.java
@@ -38,7 +38,6 @@
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.DeferredViewStubInflationProvider;
 import org.chromium.ui.widget.ChipView;
 
 import java.util.concurrent.ExecutionException;
@@ -62,9 +61,8 @@
         mActivityTestRule.startMainActivityOnBlankPage();
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             AccessorySheetCoordinator accessorySheet =
-                    new AccessorySheetCoordinator(new DeferredViewStubInflationProvider<>(
-                            mActivityTestRule.getActivity().findViewById(
-                                    R.id.keyboard_accessory_sheet_stub)));
+                    new AccessorySheetCoordinator(mActivityTestRule.getActivity().findViewById(
+                            R.id.keyboard_accessory_sheet_stub));
             accessorySheet.setTabs(new KeyboardAccessoryData.Tab[] {new KeyboardAccessoryData.Tab(
                     "Passwords", null, null, R.layout.password_accessory_sheet,
                     AccessoryTabType.ALL, new KeyboardAccessoryData.Tab.Listener() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
index c22a160..7323193 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
@@ -39,7 +39,6 @@
 import org.chromium.content_public.browser.test.util.Criteria;
 import org.chromium.content_public.browser.test.util.CriteriaHelper;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
-import org.chromium.ui.DeferredViewStubInflationProvider;
 
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicReference;
@@ -67,9 +66,8 @@
             @LayoutRes int layout, KeyboardAccessoryData.Tab.Listener listener) {
         TestThreadUtils.runOnUiThreadBlocking(() -> {
             AccessorySheetCoordinator accessorySheet =
-                    new AccessorySheetCoordinator(new DeferredViewStubInflationProvider<>(
-                            mActivityTestRule.getActivity().findViewById(
-                                    R.id.keyboard_accessory_sheet_stub)));
+                    new AccessorySheetCoordinator(mActivityTestRule.getActivity().findViewById(
+                            R.id.keyboard_accessory_sheet_stub));
             accessorySheet.setTabs(new KeyboardAccessoryData.Tab[] {new KeyboardAccessoryData.Tab(
                     "Passwords", null, null, layout, AccessoryTabType.ALL, listener)});
             accessorySheet.setHeight(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
index d66a8c6..3d7df67 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabLayoutViewTest.java
@@ -21,29 +21,27 @@
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_INVISIBLE;
 import static org.chromium.chrome.test.util.ViewUtils.VIEW_NULL;
 import static org.chromium.chrome.test.util.ViewUtils.waitForView;
+import static org.chromium.content_public.browser.test.util.TestThreadUtils.runOnUiThreadBlocking;
 
 import android.support.test.filters.MediumTest;
 import android.view.View;
 import android.view.ViewGroup;
-import android.view.ViewStub;
+import android.widget.FrameLayout;
 import android.widget.ImageView;
 
 import org.hamcrest.Matcher;
-import org.junit.Before;
-import org.junit.Rule;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
-import org.chromium.chrome.browser.ChromeTabbedActivity;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryView;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
-import org.chromium.chrome.test.ChromeActivityTestRule;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.ui.DummyUiActivity;
+import org.chromium.chrome.test.ui.DummyUiActivityTestCase;
 import org.chromium.ui.modelutil.ListModel;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -52,18 +50,13 @@
  */
 @RunWith(ChromeJUnit4ClassRunner.class)
 @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
-public class KeyboardAccessoryTabLayoutViewTest {
+public class KeyboardAccessoryTabLayoutViewTest extends DummyUiActivityTestCase {
     private PropertyModel mModel;
     private KeyboardAccessoryTabLayoutView mView;
 
-    @Rule
-    public ChromeActivityTestRule<ChromeTabbedActivity> mActivityTestRule =
-            new ChromeActivityTestRule<>(ChromeTabbedActivity.class);
-
     private KeyboardAccessoryData.Tab createTestTab(String contentDescription) {
         return new KeyboardAccessoryData.Tab("Passwords",
-                mActivityTestRule.getActivity().getResources().getDrawable(
-                        android.R.drawable.ic_lock_lock), // Unused.
+                getActivity().getResources().getDrawable(android.R.drawable.ic_lock_lock),
                 contentDescription,
                 R.layout.empty_accessory_sheet, // Unused.
                 AccessoryTabType.ALL,
@@ -81,17 +74,23 @@
                 instanceOf(ImageView.class)); // Match only the image.
     }
 
-    @Before
-    public void setUp() throws InterruptedException {
-        mActivityTestRule.startMainActivityOnBlankPage();
-        ThreadUtils.runOnUiThreadBlocking(() -> {
+    @BeforeClass
+    public static void setUpBeforeActivityLaunched() {
+        DummyUiActivity.setTestLayout(R.layout.keyboard_accessory_tabs);
+    }
+
+    @Override
+    public void setUpTest() throws Exception {
+        super.setUpTest();
+
+        runOnUiThreadBlocking(() -> {
             mModel = new PropertyModel.Builder(TABS, ACTIVE_TAB, TAB_SELECTION_CALLBACKS)
                              .with(TABS, new ListModel<>())
                              .with(ACTIVE_TAB, null)
                              .build();
-            ViewStub viewStub =
-                    mActivityTestRule.getActivity().findViewById(R.id.keyboard_accessory_stub);
-            mView = viewStub.inflate().findViewById(R.id.tabs);
+            mView = (KeyboardAccessoryTabLayoutView) ((FrameLayout) getActivity().findViewById(
+                                                              android.R.id.content))
+                            .getChildAt(0);
             KeyboardAccessoryTabLayoutCoordinator.createTabViewBinder(mModel, mView);
         });
     }
@@ -99,8 +98,7 @@
     @Test
     @MediumTest
     public void testRemovesTabs() {
-        ThreadUtils.runOnUiThreadBlocking(() -> {
-            ((KeyboardAccessoryView) mView.getParent().getParent()).setVisible(true);
+        runOnUiThreadBlocking(() -> {
             mModel.get(TABS).set(new KeyboardAccessoryData.Tab[] {createTestTab("FirstTab"),
                     createTestTab("SecondTab"), createTestTab("ThirdTab")});
         });
@@ -111,7 +109,7 @@
         onView(isTabWithDescription("SecondTab")).check(matches(isDisplayed()));
         onView(isTabWithDescription("ThirdTab")).check(matches(isDisplayed()));
 
-        ThreadUtils.runOnUiThreadBlocking(() -> mModel.get(TABS).remove(mModel.get(TABS).get(1)));
+        runOnUiThreadBlocking(() -> mModel.get(TABS).remove(mModel.get(TABS).get(1)));
 
         onView(isRoot()).check(
                 (root, e)
@@ -125,8 +123,7 @@
     @Test
     @MediumTest
     public void testAddsTabs() {
-        ThreadUtils.runOnUiThreadBlocking(() -> {
-            ((KeyboardAccessoryView) mView.getParent().getParent()).setVisible(true);
+        runOnUiThreadBlocking(() -> {
             mModel.get(TABS).set(new KeyboardAccessoryData.Tab[] {
                     createTestTab("FirstTab"), createTestTab("SecondTab")});
         });
@@ -137,7 +134,7 @@
         onView(isTabWithDescription("SecondTab")).check(matches(isDisplayed()));
         onView(isTabWithDescription("ThirdTab")).check(doesNotExist());
 
-        ThreadUtils.runOnUiThreadBlocking(() -> mModel.get(TABS).add(createTestTab("ThirdTab")));
+        runOnUiThreadBlocking(() -> mModel.get(TABS).add(createTestTab("ThirdTab")));
 
         onView(isRoot()).check(
                 (root, e) -> waitForView((ViewGroup) root, isTabWithDescription("ThirdTab")));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
new file mode 100644
index 0000000..100bf221
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/keyboard_accessory/tab_layout_component/KeyboardAccessoryTabTestHelper.java
@@ -0,0 +1,22 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component;
+
+import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom;
+
+import android.view.View;
+
+import org.hamcrest.Matcher;
+
+/**
+ * Helpers in this class simplify interactions with the Keyboard Accessory Tab Layout.
+ */
+public class KeyboardAccessoryTabTestHelper {
+    private KeyboardAccessoryTabTestHelper() {}
+
+    public static Matcher<View> isKeyboardAccessoryTabLayout() {
+        return isAssignableFrom(KeyboardAccessoryTabLayoutView.class);
+    }
+}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
index 186efdd..cd81e11 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuTest.java
@@ -24,6 +24,7 @@
 
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.FlakyTest;
 import org.chromium.base.test.util.RetryOnFailure;
@@ -284,6 +285,7 @@
     @LargeTest
     @Feature({"Browser"})
     @RetryOnFailure
+    @DisabledTest(message = "https://crbug.com/947695")
     public void testSaveVideo()
             throws InterruptedException, TimeoutException, SecurityException, IOException {
         // Click the video to enable playback
@@ -419,6 +421,7 @@
     @SmallTest
     @Feature({"Browser", "ContextMenu"})
     @RetryOnFailure
+    @DisabledTest(message = "https://crbug.com/947695")
     public void testContextMenuRetrievesVideoOptions()
             throws TimeoutException, InterruptedException {
         Tab tab = mDownloadTestRule.getActivity().getActivityTab();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivity.java b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivity.java
index 430ce9d..e28bd100 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivity.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/test/ui/DummyUiActivity.java
@@ -7,6 +7,7 @@
 import android.app.Activity;
 import android.os.Bundle;
 import android.support.annotation.IdRes;
+import android.support.annotation.LayoutRes;
 
 /** Dummy activity to test UI components without Chrome browser initialization and natives. */
 public class DummyUiActivity extends Activity {
@@ -40,7 +41,7 @@
      * launched.
      * @param layoutResID Resource ID to be inflated.
      */
-    public static void setTestLayout(@IdRes int layoutResID) {
+    public static void setTestLayout(@LayoutRes int layoutResID) {
         sTestLayout = layoutResID;
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
index 82f50fc..4e0e5e98 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/ManualFillingControllerTest.java
@@ -14,17 +14,15 @@
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction.GENERATE_PASSWORD_AUTOMATIC;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.Type.PASSWORD_INFO;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.AccessorySheetTabModel.AccessorySheetDataPiece.getType;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.ACTIVE_TAB;
-import static org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutProperties.TABS;
 import static org.chromium.chrome.browser.tab.Tab.INVALID_TAB_ID;
 import static org.chromium.chrome.browser.tabmodel.TabLaunchType.FROM_BROWSER_ACTIONS;
-import static org.chromium.chrome.browser.tabmodel.TabSelectionType.FROM_CLOSE;
 import static org.chromium.chrome.browser.tabmodel.TabSelectionType.FROM_NEW;
 import static org.chromium.chrome.browser.tabmodel.TabSelectionType.FROM_USER;
 
@@ -36,6 +34,7 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.robolectric.annotation.Config;
@@ -49,18 +48,13 @@
 import org.chromium.chrome.browser.ChromeKeyboardVisibilityDelegate;
 import org.chromium.chrome.browser.ChromeWindow;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryModernView;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.AccessorySheetData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.UserInfo;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetProperties;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetView;
+import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_component.AccessorySheetCoordinator;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.sheet_tabs.PasswordAccessorySheetCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView;
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.Tab.TabHidingType;
@@ -71,12 +65,11 @@
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.KeyboardVisibilityDelegate;
 import org.chromium.ui.display.DisplayAndroid;
-import org.chromium.ui.modelutil.ListModel;
-import org.chromium.ui.modelutil.ListObservable;
-import org.chromium.ui.modelutil.PropertyModel;
-import org.chromium.ui.test.util.modelutil.FakeViewProvider;
 
 import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Controller tests for the root controller for interactions with the manual filling UI.
@@ -96,16 +89,6 @@
     @Mock
     private ViewGroup mMockContentView;
     @Mock
-    private KeyboardAccessoryModernView mMockKeyboardAccessoryView;
-    @Mock
-    private KeyboardAccessoryTabLayoutView mMockTabSwitcherView;
-    @Mock
-    private AccessorySheetView mMockViewPager;
-    @Mock
-    private ListObservable.ListObserver<Void> mMockTabListObserver;
-    @Mock
-    private ListObservable.ListObserver<Void> mMockItemListObserver;
-    @Mock
     private TabModelSelector mMockTabModelSelector;
     @Mock
     private Drawable mMockIcon;
@@ -113,14 +96,151 @@
     private android.content.res.Resources mMockResources;
     @Mock
     private ChromeKeyboardVisibilityDelegate mMockKeyboard;
+    @Mock
+    private KeyboardAccessoryCoordinator mMockKeyboardAccessory;
+    @Mock
+    private AccessorySheetCoordinator mMockAccessorySheet;
 
     @Rule
     public Features.JUnitProcessor mFeaturesProcessor = new Features.JUnitProcessor();
 
-    private ManualFillingCoordinator mController = new ManualFillingCoordinator();
-
+    private final ManualFillingCoordinator mController = new ManualFillingCoordinator();
+    private final ManualFillingMediator mMediator = mController.getMediatorForTesting();
+    private final ManualFillingStateCache mCache = mMediator.getStateCacheForTesting();
     private final UserDataHost mUserDataHost = new UserDataHost();
 
+    /**
+     * Helper class that provides shortcuts to providing and observing AccessorySheetData and
+     * Actions.
+     */
+    private static class SheetProviderHelper {
+        private final PropertyProvider<Action[]> mActionListProvider =
+                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
+        private final PropertyProvider<AccessorySheetData> mAccessorySheetDataProvider =
+                new PropertyProvider<>();
+
+        private final ArrayList<Action> mRecordedActions = new ArrayList<>();
+        private int mRecordedActionNotifications;
+        private final AtomicReference<AccessorySheetData> mRecordedSheetData =
+                new AtomicReference<>();
+
+        /**
+         * Can be used to capture data from an observer. Retrieve the last captured data with
+         * {@link #getRecordedActions()} and {@link #getFirstRecordedAction()}.
+         * @param unusedTypeId Unused but necessary to enable use as method reference.
+         * @param item The {@link Action[]} provided by a {@link PropertyProvider<Action[]>}.
+         */
+        void record(int unusedTypeId, Action[] item) {
+            mRecordedActionNotifications++;
+            mRecordedActions.clear();
+            mRecordedActions.addAll(Arrays.asList(item));
+        }
+
+        /**
+         * Can be used to capture data from an observer. Retrieve the last captured data with
+         * {@link #getRecordedSheetData()} and {@link #getFirstRecordedPassword()}.
+         * @param unusedTypeId Unused but necessary to enable use as method reference.
+         * @param data The {@link AccessorySheetData} provided by a {@link PropertyProvider}.
+         */
+        void record(int unusedTypeId, AccessorySheetData data) {
+            mRecordedSheetData.set(data);
+        }
+
+        /**
+         * Uses the provider as returned by {@link #getActionListProvider()} to provide an Action.
+         * @param actionCaption The caption for the provided generation action.
+         */
+        void provideAction(String actionCaption) {
+            provideActions(new Action[] {
+                    new Action(actionCaption, GENERATE_PASSWORD_AUTOMATIC, action -> {})});
+        }
+
+        /**
+         * Uses the provider as returned by {@link #getActionListProvider()} to provide Actions.
+         * @param actions The {@link Action}s to provide.
+         */
+        void provideActions(Action[] actions) {
+            mActionListProvider.notifyObservers(actions);
+        }
+
+        /**
+         * Uses the provider as returned by {@link #getSheetDataProvider()} to provide an simple
+         * password sheet with one credential pair.
+         * @param passwordString The only provided password in the new sheet.
+         */
+        void providePasswordSheet(String passwordString) {
+            AccessorySheetData sheetData =
+                    new AccessorySheetData(FallbackSheetType.PASSWORD, "Passwords");
+            UserInfo userInfo = new UserInfo(null);
+            userInfo.addField(new UserInfo.Field("(No username)", "No username", false, null));
+            userInfo.addField(new UserInfo.Field(passwordString, "Password", true, null));
+            sheetData.getUserInfoList().add(userInfo);
+            mAccessorySheetDataProvider.notifyObservers(sheetData);
+        }
+
+        /**
+         * @return The {@link Action} last captured with {@link #record(int, Action[])}.
+         */
+        Action getFirstRecordedAction() {
+            int firstNonTabLayoutAction = 1;
+            if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
+                firstNonTabLayoutAction = 0;
+            }
+            assert mRecordedActions.size() >= firstNonTabLayoutAction;
+            return mRecordedActions.get(firstNonTabLayoutAction);
+        }
+
+        /**
+         * @return First password in a sheet captured by {@link #record(int, AccessorySheetData)}.
+         */
+        String getFirstRecordedPassword() {
+            assert getRecordedSheetData() != null;
+            assert getRecordedSheetData().getUserInfoList() != null;
+            UserInfo info = getRecordedSheetData().getUserInfoList().get(0);
+            assert info != null;
+            assert info.getFields() != null;
+            assert info.getFields().size() > 1;
+            return info.getFields().get(1).getDisplayText();
+        }
+
+        /**
+         * @return True if {@link #record(int, Action[])} was notified.
+         */
+        boolean hasRecordedActions() {
+            return mRecordedActionNotifications > 0;
+        }
+
+        /**
+         * @return The {@link Action}s last captured with {@link #record(int, Action[])}.
+         */
+        ArrayList<Action> getRecordedActions() {
+            return mRecordedActions;
+        }
+
+        /**
+         * @return {@link AccessorySheetData} captured by {@link #record(int, AccessorySheetData)}.
+         */
+        AccessorySheetData getRecordedSheetData() {
+            return mRecordedSheetData.get();
+        }
+
+        /**
+         * The returned provider is the same used by {@link #provideActions(Action[])}.
+         * @return A {@link PropertyProvider}.
+         */
+        PropertyProvider<Action[]> getActionListProvider() {
+            return mActionListProvider;
+        }
+
+        /**
+         * The returned provider is the same used by {@link #providePasswordSheet(String)}.
+         * @return A {@link PropertyProvider}.
+         */
+        PropertyProvider<AccessorySheetData> getSheetDataProvider() {
+            return mAccessorySheetDataProvider;
+        }
+    }
+
     @Before
     public void setUp() {
         ShadowRecordHistogram.reset();
@@ -138,59 +258,55 @@
         when(mMockActivity.getCurrentWebContents()).then(i -> mLastMockWebContents);
         when(mMockResources.getDimensionPixelSize(anyInt())).thenReturn(48);
         PasswordAccessorySheetCoordinator.IconProvider.getInstance().setIconForTesting(mMockIcon);
-        when(mMockKeyboardAccessoryView.getTabLayout()).thenReturn(mMockTabSwitcherView);
-        mController.initialize(mMockWindow,
-                new FakeViewProvider<>(mMockKeyboardAccessoryView),
-                new FakeViewProvider<>(mMockViewPager));
+        mController.initialize(mMockWindow, mMockKeyboardAccessory, mMockAccessorySheet);
     }
 
     @Test
     public void testCreatesValidSubComponents() {
         assertThat(mController, is(notNullValue()));
-        assertThat(mController.getMediatorForTesting(), is(notNullValue()));
-        assertThat(mController.getKeyboardAccessory(), is(notNullValue()));
-        assertThat(mController.getMediatorForTesting().getAccessorySheet(), is(notNullValue()));
-    }
-
-    private KeyboardAccessoryTabLayoutCoordinator getTabLayout() {
-        assert mController.getKeyboardAccessory() != null;
-        return mController.getKeyboardAccessory().getTabLayoutForTesting();
+        assertThat(mMediator, is(notNullValue()));
+        assertThat(mCache, is(notNullValue()));
     }
 
     @Test
     public void testAddingNewTabIsAddedToAccessoryAndSheet() {
-        PropertyModel accessorySheetModel = mController.getMediatorForTesting()
-                                                    .getAccessorySheet()
-                                                    .getMediatorForTesting()
-                                                    .getModelForTesting();
-        accessorySheetModel.get(AccessorySheetProperties.TABS).addObserver(mMockTabListObserver);
-        getTabLayout().getModelForTesting().get(TABS).addObserver(mMockTabListObserver);
+        // Clear any calls that happened during initialization:
+        reset(mMockKeyboardAccessory);
+        reset(mMockAccessorySheet);
 
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(0));
+        // Create a new tab with a passwords tab:
+        addBrowserTab(mMediator, 1111, null);
 
-        mController.getMediatorForTesting().getOrCreatePasswordSheet();
+        // Registering a provider creates a new passwords tab:
+        mController.registerPasswordProvider(new PropertyProvider<>());
 
-        verify(mMockTabListObserver)
-                .onItemRangeInserted(getTabLayout().getModelForTesting().get(TABS), 0, 1);
-        verify(mMockTabListObserver)
-                .onItemRangeInserted(accessorySheetModel.get(AccessorySheetProperties.TABS), 0, 1);
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(1));
+        // Now check the how many tabs were sent to the sub components:
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> barTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> sheetTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        verify(mMockKeyboardAccessory, times(2)).setTabs(barTabCaptor.capture());
+        verify(mMockAccessorySheet, times(2)).setTabs(sheetTabCaptor.capture());
+
+        // Initial empty state:
+        assertThat(barTabCaptor.getAllValues().get(0).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(0).length, is(0));
+
+        // When creating the password sheet:
+        assertThat(barTabCaptor.getAllValues().get(1).length, is(1));
+        assertThat(sheetTabCaptor.getAllValues().get(1).length, is(1));
     }
 
     @Test
     public void testAddingBrowserTabsCreatesValidAccessoryState() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
         // Emulate adding a browser tab. Expect the model to have another entry.
-        Tab firstTab = addTab(mediator, 1111, null);
-        ManualFillingState firstState = cache.getStateFor(firstTab);
+        Tab firstTab = addBrowserTab(mMediator, 1111, null);
+        ManualFillingState firstState = mCache.getStateFor(firstTab);
         assertThat(firstState, notNullValue());
 
         // Emulate adding a second browser tab. Expect the model to have another entry.
-        Tab secondTab = addTab(mediator, 2222, firstTab);
-        ManualFillingState secondState = cache.getStateFor(secondTab);
+        Tab secondTab = addBrowserTab(mMediator, 2222, firstTab);
+        ManualFillingState secondState = mCache.getStateFor(secondTab);
         assertThat(secondState, notNullValue());
 
         assertThat(firstState, not(equalTo(secondState)));
@@ -198,332 +314,366 @@
 
     @Test
     public void testPasswordItemsPersistAfterSwitchingBrowserTabs() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        PropertyProvider<AccessorySheetData> firstTabProvider = new PropertyProvider<>();
-        PropertyProvider<AccessorySheetData> secondTabProvider = new PropertyProvider<>();
+        SheetProviderHelper firstTabHelper = new SheetProviderHelper();
+        SheetProviderHelper secondTabHelper = new SheetProviderHelper();
 
         // Simulate opening a new tab which automatically triggers the registration:
-        Tab firstTab = addTab(mediator, 1111, null);
-        mController.registerPasswordProvider(firstTabProvider);
-        firstTabProvider.notifyObservers(createPasswordData("FirstPassword"));
-
-        assertThat(getFirstPassword(mediator), is("FirstPassword"));
+        Tab firstTab = addBrowserTab(mMediator, 1111, null);
+        mController.registerPasswordProvider(firstTabHelper.getSheetDataProvider());
+        getStateForBrowserTab().getPasswordSheetDataProvider().addObserver(firstTabHelper::record);
+        firstTabHelper.providePasswordSheet("FirstPassword");
+        assertThat(firstTabHelper.getFirstRecordedPassword(), is("FirstPassword"));
 
         // Simulate creating a second tab:
-        Tab secondTab = addTab(mediator, 2222, firstTab);
-        mController.registerPasswordProvider(secondTabProvider);
-        secondTabProvider.notifyObservers(createPasswordData("SecondPassword"));
-        assertThat(getFirstPassword(mediator), is("SecondPassword"));
+        Tab secondTab = addBrowserTab(mMediator, 2222, firstTab);
+        mController.registerPasswordProvider(secondTabHelper.getSheetDataProvider());
+        getStateForBrowserTab().getPasswordSheetDataProvider().addObserver(secondTabHelper::record);
+        secondTabHelper.providePasswordSheet("SecondPassword");
+        assertThat(secondTabHelper.getFirstRecordedPassword(), is("SecondPassword"));
 
         // Simulate switching back to the first tab:
-        switchTab(mediator, /*from=*/secondTab, /*to=*/firstTab);
-        assertThat(getFirstPassword(mediator), is("FirstPassword"));
+        switchBrowserTab(mMediator, /*from=*/secondTab, /*to=*/firstTab);
+        assertThat(firstTabHelper.getFirstRecordedPassword(), is("FirstPassword"));
 
         // And back to the second:
-        switchTab(mediator, /*from=*/firstTab, /*to=*/secondTab);
-        assertThat(getFirstPassword(mediator), is("SecondPassword"));
+        switchBrowserTab(mMediator, /*from=*/firstTab, /*to=*/secondTab);
+        assertThat(secondTabHelper.getFirstRecordedPassword(), is("SecondPassword"));
     }
 
     @Test
     public void testKeyboardAccessoryActionsPersistAfterSwitchingBrowserTabs() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        PropertyProvider<Action[]> firstTabProvider =
-                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        PropertyProvider<Action[]> secondTabProvider =
-                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        ListModel<KeyboardAccessoryProperties.BarItem> keyboardActions =
-                mediator.getKeyboardAccessory().getMediatorForTesting().getModelForTesting().get(
-                        KeyboardAccessoryProperties.BAR_ITEMS);
-        keyboardActions.addObserver(mMockItemListObserver);
+        SheetProviderHelper firstTabHelper = new SheetProviderHelper();
+        SheetProviderHelper secondTabHelper = new SheetProviderHelper();
 
         // Simulate opening a new tab which automatically triggers the registration:
-        Tab firstTab = addTab(mediator, 1111, null);
-        mController.registerActionProvider(firstTabProvider);
-        firstTabProvider.notifyObservers(new Action[] {
-                new Action("Generate Password", GENERATE_PASSWORD_AUTOMATIC, p -> {})});
-        mMockItemListObserver.onItemRangeInserted(keyboardActions, 0, 2);
-        assertThat(getFirstKeyboardActionTitle(), is("Generate Password"));
+        Tab firstTab = addBrowserTab(mMediator, 1111, null);
+        mController.registerActionProvider(firstTabHelper.getActionListProvider());
+        getStateForBrowserTab().getActionsProvider().addObserver(firstTabHelper::record);
+        firstTabHelper.provideAction("Generate Password");
+        assertThat(firstTabHelper.getFirstRecordedAction().getCaption(), is("Generate Password"));
 
         // Simulate creating a second tab:
-        Tab secondTab = addTab(mediator, 2222, firstTab);
-        mController.registerActionProvider(secondTabProvider);
-        secondTabProvider.notifyObservers(new Action[0]);
-        mMockItemListObserver.onItemRangeRemoved(keyboardActions, 0, 1);
-        assertThat(keyboardActions.size(), is(1)); // tab switcher is only item on this browser tab.
+        Tab secondTab = addBrowserTab(mMediator, 2222, firstTab);
+        mController.registerActionProvider(secondTabHelper.getActionListProvider());
+        getStateForBrowserTab().getActionsProvider().addObserver(secondTabHelper::record);
+        secondTabHelper.provideActions(new Action[0]);
+        assertThat(secondTabHelper.getRecordedActions().size(), is(0));
 
         // Simulate switching back to the first tab:
-        switchTab(mediator, /*from=*/secondTab, /*to=*/firstTab);
-        mMockItemListObserver.onItemRangeInserted(keyboardActions, 0, 1);
-        assertThat(getFirstKeyboardActionTitle(), is("Generate Password"));
+        switchBrowserTab(mMediator, /*from=*/secondTab, /*to=*/firstTab);
+        assertThat(firstTabHelper.getFirstRecordedAction().getCaption(), is("Generate Password"));
 
         // And back to the second:
-        switchTab(mediator, /*from=*/firstTab, /*to=*/secondTab);
-        mMockItemListObserver.onItemRangeRemoved(keyboardActions, 0, 1);
-        assertThat(keyboardActions.size(), is(1)); // tab switcher is only item on this browser tab.
+        switchBrowserTab(mMediator, /*from=*/firstTab, /*to=*/secondTab);
+        assertThat(secondTabHelper.getRecordedActions().size(), is(0));
     }
 
     @Test
     public void testPasswordTabRestoredWhenSwitchingBrowserTabs() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        PropertyModel accessorySheetModel =
-                mediator.getAccessorySheet().getMediatorForTesting().getModelForTesting();
+        // Clear any calls that happened during initialization:
+        reset(mMockKeyboardAccessory);
+        reset(mMockAccessorySheet);
 
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(0));
+        // Create a new tab:
+        Tab firstTab = addBrowserTab(mMediator, 1111, null);
 
-        // Create a new tab with a passwords tab:
-        Tab firstTab = addTab(mediator, 1111, null);
+        // Create a new passwords tab:
         mController.registerPasswordProvider(new PropertyProvider<>());
-        // There should be a tab in accessory and sheet:
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(1));
 
         // Simulate creating a second tab without any tabs:
-        Tab secondTab = addTab(mediator, 2222, firstTab);
-        // There should be no tab in accessory and sheet:
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(0));
+        Tab secondTab = addBrowserTab(mMediator, 2222, firstTab);
 
         // Simulate switching back to the first tab:
-        switchTab(mediator, /*from=*/secondTab, /*to=*/firstTab);
-        // There should be a tab in accessory and sheet:
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(1));
+        switchBrowserTab(mMediator, /*from=*/secondTab, /*to=*/firstTab);
 
         // And back to the second:
-        switchTab(mediator, /*from=*/firstTab, /*to=*/secondTab);
-        // Still no tab in accessory and sheet:
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(0));
+        switchBrowserTab(mMediator, /*from=*/firstTab, /*to=*/secondTab);
+
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> barTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> sheetTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        verify(mMockKeyboardAccessory, times(5)).setTabs(barTabCaptor.capture());
+        verify(mMockAccessorySheet, times(5)).setTabs(sheetTabCaptor.capture());
+
+        // Initial empty state:
+        assertThat(barTabCaptor.getAllValues().get(0).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(0).length, is(0));
+
+        // When creating the password sheet in 1st tab:
+        assertThat(barTabCaptor.getAllValues().get(1).length, is(1));
+        assertThat(sheetTabCaptor.getAllValues().get(1).length, is(1));
+
+        // When switching to empty 2nd tab:
+        assertThat(barTabCaptor.getAllValues().get(2).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(2).length, is(0));
+
+        // When switching back to 1st tab with password sheet:
+        assertThat(barTabCaptor.getAllValues().get(3).length, is(1));
+        assertThat(sheetTabCaptor.getAllValues().get(3).length, is(1));
+
+        // When switching back to empty 2nd tab:
+        assertThat(barTabCaptor.getAllValues().get(4).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(4).length, is(0));
     }
 
     @Test
     public void testPasswordTabRestoredWhenClosingTabIsUndone() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
+        // Clear any calls that happened during initialization:
+        reset(mMockKeyboardAccessory);
+        reset(mMockAccessorySheet);
 
         // Create a new tab with a passwords tab:
-        Tab tab = addTab(mediator, 1111, null);
+        Tab tab = addBrowserTab(mMediator, 1111, null);
+
+        // Create a new passwords tab:
         mController.registerPasswordProvider(new PropertyProvider<>());
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
 
         // Simulate closing the tab (uncommitted):
-        mediator.getTabModelObserverForTesting().willCloseTab(tab, false);
-        mediator.getTabObserverForTesting().onHidden(tab, TabHidingType.CHANGED_TABS);
-        cache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
+        mMediator.getTabModelObserverForTesting().willCloseTab(tab, false);
+        mMediator.getTabObserverForTesting().onHidden(tab, TabHidingType.CHANGED_TABS);
+        getStateForBrowserTab().getWebContentsObserverForTesting().wasHidden();
+        // The state should be kept if the closure wasn't committed.
+        assertThat(getStateForBrowserTab().getPasswordAccessorySheet(), is(not(nullValue())));
         mLastMockWebContents = null;
 
         // Simulate undo closing the tab and selecting it:
-        mediator.getTabModelObserverForTesting().tabClosureUndone(tab);
-        switchTab(mediator, null, tab);
-        // There should still be a tab in the accessory:
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
+        mMediator.getTabModelObserverForTesting().tabClosureUndone(tab);
+        switchBrowserTab(mMediator, null, tab);
 
         // Simulate closing the tab and committing to it (i.e. wait out undo message):
-        closeTab(mediator, tab, null);
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(0));
+        WebContents oldWebContents = mLastMockWebContents;
+        closeBrowserTab(mMediator, tab);
+        // The state should be cleaned up, now that it was committed.
+        assertThat(mCache.getStateFor(oldWebContents).getPasswordAccessorySheet(), is(nullValue()));
+
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> barTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        ArgumentCaptor<KeyboardAccessoryData.Tab[]> sheetTabCaptor =
+                ArgumentCaptor.forClass(KeyboardAccessoryData.Tab[].class);
+        verify(mMockKeyboardAccessory, times(4)).setTabs(barTabCaptor.capture());
+        verify(mMockAccessorySheet, times(4)).setTabs(sheetTabCaptor.capture());
+
+        // Initial empty state:
+        assertThat(barTabCaptor.getAllValues().get(0).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(0).length, is(0));
+
+        // When creating the password sheet:
+        assertThat(barTabCaptor.getAllValues().get(1).length, is(1));
+        assertThat(sheetTabCaptor.getAllValues().get(1).length, is(1));
+
+        // When restoring the tab:
+        assertThat(barTabCaptor.getAllValues().get(2).length, is(1));
+        assertThat(sheetTabCaptor.getAllValues().get(2).length, is(1));
+
+        // When committing to close the tab:
+        assertThat(barTabCaptor.getAllValues().get(3).length, is(0));
+        assertThat(sheetTabCaptor.getAllValues().get(3).length, is(0));
     }
 
     @Test
     public void testTreatNeverProvidedActionsAsEmptyActionList() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        PropertyModel keyboardAccessoryModel =
-                mediator.getKeyboardAccessory().getMediatorForTesting().getModelForTesting();
+        SheetProviderHelper firstTabHelper = new SheetProviderHelper();
+        SheetProviderHelper secondTabHelper = new SheetProviderHelper();
 
         // Open a tab.
-        Tab tab = addTab(mediator, 1111, null);
-        // Add an action provider that never provided actions.
+        Tab tab = addBrowserTab(mMediator, 1111, null);
+        // Add an action provider that never provides any actions.
         mController.registerActionProvider(new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC));
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(1));
+        getStateForBrowserTab().getActionsProvider().addObserver(firstTabHelper::record);
 
         // Create a new tab with an action:
-        Tab secondTab = addTab(mediator, 1111, tab);
-        PropertyProvider<Action[]> provider = new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        mController.registerActionProvider(provider);
-        provider.notifyObservers(new Action[] {
-                new Action("Test Action", GENERATE_PASSWORD_AUTOMATIC, (action) -> {})});
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(2));
+        Tab secondTab = addBrowserTab(mMediator, 1111, tab);
+        mController.registerActionProvider(secondTabHelper.getActionListProvider());
+        getStateForBrowserTab().getActionsProvider().addObserver(secondTabHelper::record);
+        secondTabHelper.provideAction("Test Action");
+        assertThat(secondTabHelper.getFirstRecordedAction().getCaption(), is("Test Action"));
 
-        switchTab(mediator, secondTab, tab);
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(1));
+        // Switching back should notify the accessory about the still empty state of the accessory.
+        switchBrowserTab(mMediator, secondTab, tab);
+        assertThat(firstTabHelper.hasRecordedActions(), is(true));
+        assertThat(firstTabHelper.getRecordedActions().size(), is(0));
     }
 
     @Test
     public void testUpdatesInactiveAccessory() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        PropertyModel keyboardAccessoryModel =
-                mediator.getKeyboardAccessory().getMediatorForTesting().getModelForTesting();
+        SheetProviderHelper delayedTabHelper = new SheetProviderHelper();
+        SheetProviderHelper secondTabHelper = new SheetProviderHelper();
 
         // Open a tab.
-        Tab tab = addTab(mediator, 1111, null);
+        Tab delayedTab = addBrowserTab(mMediator, 1111, null);
         // Add an action provider that hasn't provided actions yet.
-        PropertyProvider<Action[]> delayedProvider =
-                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        mController.registerActionProvider(delayedProvider);
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(1));
+        mController.registerActionProvider(delayedTabHelper.getActionListProvider());
+        getStateForBrowserTab().getActionsProvider().addObserver(delayedTabHelper::record);
+        assertThat(delayedTabHelper.hasRecordedActions(), is(false));
 
         // Create and switch to a new tab:
-        Tab secondTab = addTab(mediator, 2222, tab);
-        PropertyProvider<Action[]> provider = new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        mController.registerActionProvider(provider);
+        Tab secondTab = addBrowserTab(mMediator, 2222, delayedTab);
+        mController.registerActionProvider(secondTabHelper.getActionListProvider());
+        getStateForBrowserTab().getActionsProvider().addObserver(secondTabHelper::record);
 
         // And provide data to the active browser tab.
-        provider.notifyObservers(new Action[] {
-                new Action("Test Action", GENERATE_PASSWORD_AUTOMATIC, (action) -> {})});
+        secondTabHelper.provideAction("Test Action");
         // Now, have the delayed provider provide data for the backgrounded browser tab.
-        delayedProvider.notifyObservers(
-                new Action[] {new Action("Delayed", GENERATE_PASSWORD_AUTOMATIC, (action) -> {})});
+        delayedTabHelper.provideAction("Delayed");
 
         // The current tab should not be influenced by the delayed provider.
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(2));
-        assertThat(getFirstKeyboardActionTitle(), is("Test Action"));
+        assertThat(secondTabHelper.getRecordedActions().size(), is(1));
+        assertThat(secondTabHelper.getFirstRecordedAction().getCaption(), is("Test Action"));
 
         // Switching tabs back should only show the action that was received in the background.
-        switchTab(mediator, secondTab, tab);
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(2));
-        assertThat(getFirstKeyboardActionTitle(), is("Delayed"));
+        switchBrowserTab(mMediator, secondTab, delayedTab);
+        assertThat(delayedTabHelper.getRecordedActions().size(), is(1));
+        assertThat(delayedTabHelper.getFirstRecordedAction().getCaption(), is("Delayed"));
     }
 
     @Test
     public void testDestroyingTabCleansModelForThisTab() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
-        PropertyModel keyboardAccessoryModel =
-                mediator.getKeyboardAccessory().getMediatorForTesting().getModelForTesting();
-        PropertyModel accessorySheetModel = mController.getMediatorForTesting()
-                                                    .getAccessorySheet()
-                                                    .getMediatorForTesting()
-                                                    .getModelForTesting();
-
-        PropertyProvider<AccessorySheetData> firstTabProvider = new PropertyProvider<>();
-        PropertyProvider<Action[]> firstActionProvider =
-                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
-        PropertyProvider<AccessorySheetData> secondTabProvider = new PropertyProvider<>();
-        PropertyProvider<Action[]> secondActionProvider =
-                new PropertyProvider<>(GENERATE_PASSWORD_AUTOMATIC);
+        // Clear any calls that happened during initialization:
+        reset(mMockKeyboardAccessory);
+        reset(mMockAccessorySheet);
+        SheetProviderHelper firstTabHelper = new SheetProviderHelper();
+        SheetProviderHelper secondTabHelper = new SheetProviderHelper();
 
         // Simulate opening a new tab:
-        Tab firstTab = addTab(mediator, 1111, null);
-        mController.registerPasswordProvider(firstTabProvider);
-        mController.registerActionProvider(firstActionProvider);
-        firstTabProvider.notifyObservers(createPasswordData("FirstPassword"));
-        firstActionProvider.notifyObservers(new Action[] {
-                new Action("2BDestroyed", GENERATE_PASSWORD_AUTOMATIC, (action) -> {})});
+        Tab firstTab = addBrowserTab(mMediator, 1111, null);
+        mController.registerPasswordProvider(firstTabHelper.getSheetDataProvider());
+        mController.registerActionProvider(firstTabHelper.getActionListProvider());
+        getStateForBrowserTab().getPasswordSheetDataProvider().addObserver(firstTabHelper::record);
+        getStateForBrowserTab().getActionsProvider().addObserver(firstTabHelper::record);
+        firstTabHelper.providePasswordSheet("FirstPassword");
+        firstTabHelper.provideAction("2BDestroyed");
 
         // Create and switch to a new tab: (because destruction shouldn't rely on tab to be active)
-        addTab(mediator, 2222, firstTab);
-        mController.registerPasswordProvider(secondTabProvider);
-        mController.registerActionProvider(secondActionProvider);
-        secondTabProvider.notifyObservers(createPasswordData("SecondPassword"));
-        secondActionProvider.notifyObservers(
-                new Action[] {new Action("2BKept", GENERATE_PASSWORD_AUTOMATIC, (action) -> {})});
+        Tab secondTab = addBrowserTab(mMediator, 2222, firstTab);
+        mController.registerPasswordProvider(secondTabHelper.getSheetDataProvider());
+        mController.registerActionProvider(secondTabHelper.getActionListProvider());
+        getStateForBrowserTab().getPasswordSheetDataProvider().addObserver(secondTabHelper::record);
+        getStateForBrowserTab().getActionsProvider().addObserver(secondTabHelper::record);
+        secondTabHelper.providePasswordSheet("SecondPassword");
+        secondTabHelper.provideAction("2BKept");
 
-        // The current tab should be valid.
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(1));
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(2));
-        assertThat(getFirstKeyboardActionTitle(), is("2BKept"));
+        // The newly created tab should be valid.
+        assertThat(secondTabHelper.getFirstRecordedPassword(), is("SecondPassword"));
+        assertThat(secondTabHelper.getFirstRecordedAction().getCaption(), is("2BKept"));
 
         // Request destruction of the first Tab:
-        mediator.getTabObserverForTesting().onDestroyed(firstTab);
+        mMediator.getTabObserverForTesting().onDestroyed(firstTab);
 
-        // The current tab should not be influenced by the destruction.
-        assertThat(getTabLayout().getModelForTesting().get(TABS).size(), is(1));
-        assertThat(accessorySheetModel.get(AccessorySheetProperties.TABS).size(), is(1));
-        assertThat(keyboardAccessoryModel.get(KeyboardAccessoryProperties.BAR_ITEMS).size(), is(2));
-        assertThat(getFirstKeyboardActionTitle(), is("2BKept"));
-
-        // The other tabs data should be gone.
-        ManualFillingState oldState = cache.getStateFor(firstTab);
-        if (oldState == null)
-            return; // Having no state is fine - it would be completely destroyed then.
-
-        assertThat(oldState.getActionsProvider(), nullValue());
-
-        if (oldState.getPasswordAccessorySheet() == null)
-            return; // Having no password sheet is fine - it would be completely destroyed then.
-        assertThat(
-                oldState.getPasswordAccessorySheet().getSheetDataPiecesForTesting().size(), is(0));
-    }
-
-    @Test
-    public void testResumingWithoutActiveTabClearsStateAndHidesKeyboard() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-
-        // Show the accessory bar to make sure it would be dismissed.
-        getTabLayout().getTabSwitchingDelegate().addTab(
-                new KeyboardAccessoryData.Tab("Passwords", null, null, 0, 0, null));
-        mediator.getKeyboardAccessory().requestShowing();
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(true));
-
-        // No active tab was added - still we request a resume. This should just clear everything.
-        mController.onResume();
-
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(false));
-        // |getOrCreatePasswordSheet| creates a sheet if the state allows it. Here, it shouldn't.
-        assertThat(
-                mediator.getOrCreatePasswordSheet().getSheetDataPiecesForTesting().size(), is(0));
+        // The current tab should not be influenced by the destruction...
+        assertThat(secondTabHelper.getFirstRecordedPassword(), is("SecondPassword"));
+        assertThat(secondTabHelper.getFirstRecordedAction().getCaption(), is("2BKept"));
+        assertThat(getStateForBrowserTab(), is(mCache.getStateFor(secondTab)));
+        // ... but the other tab's data should be gone.
+        assertThat(mCache.getStateFor(firstTab).getActionsProvider(), nullValue());
+        assertThat(mCache.getStateFor(firstTab).getPasswordAccessorySheet(), nullValue());
     }
 
     @Test
     public void testDisplaysAccessoryOnlyWhenSpaceIsSufficient() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-        Tab tab = addTab(mediator, 1234, null);
-        when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(true);
+        reset(mMockKeyboardAccessory);
+
+        addBrowserTab(mMediator, 1234, null);
+        SheetProviderHelper tabHelper = new SheetProviderHelper();
+        mController.registerPasswordProvider(tabHelper.getSheetDataProvider());
+        when(mMockKeyboard.isSoftKeyboardShowing(any(), any())).thenReturn(true);
+        when(mMockKeyboardAccessory.hasContents()).thenReturn(true);
 
         // Show the accessory bar for the default dimensions (300x80@2.f).
-        mediator.getOrCreatePasswordSheet();
-        mediator.showWhenKeyboardIsVisible();
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(true));
+        mController.showWhenKeyboardIsVisible();
+        verify(mMockKeyboardAccessory).requestShowing();
 
-        // Use a width that is too small (e.g. on tiny phones).
-        simulateOrientationChange(mediator, 2.0f, 170, 80);
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(false));
+        // The accessory is shown and the content area plus bar size don't exceed the threshold.
+        setContentAreaDimensions(3.f, 180, (80 - /* bar height = */ 48));
+        mMediator.onLayoutChange(mMockContentView, 0, 0, 540, 96, 0, 0, 270, 120);
+
+        verify(mMockKeyboardAccessory, never()).requestClosing();
+        verify(mMockKeyboardAccessory, never()).dismiss();
+    }
+
+    @Test
+    public void testDisplaysAccessoryAfterRotation() {
+        reset(mMockKeyboardAccessory);
+
+        addBrowserTab(mMediator, 1234, null);
+        SheetProviderHelper tabHelper = new SheetProviderHelper();
+        mController.registerPasswordProvider(tabHelper.getSheetDataProvider());
+        when(mMockKeyboard.isSoftKeyboardShowing(any(), any())).thenReturn(true);
+        when(mMockKeyboardAccessory.hasContents()).thenReturn(true);
+
+        // Show the accessory bar for the default dimensions (300x80@2.f).
+        mController.showWhenKeyboardIsVisible();
+        verify(mMockKeyboardAccessory).requestShowing();
+
+        // Use valid dimension at another density. The accessory briefly closes and comes back up.
+        simulateOrientationChange(1.5f, 180, 80);
+        verify(mMockKeyboardAccessory).requestClosing();
+        verify(mMockKeyboardAccessory, times(2)).requestShowing();
+    }
+
+    @Test
+    public void testDisplaysAccessoryOnlyWhenVerticalSpaceIsSufficient() {
+        reset(mMockKeyboardAccessory);
+
+        addBrowserTab(mMediator, 1234, null);
+        SheetProviderHelper tabHelper = new SheetProviderHelper();
+        mController.registerPasswordProvider(tabHelper.getSheetDataProvider());
+        when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(true);
+        when(mMockKeyboardAccessory.hasContents()).thenReturn(true);
+
+        // Show the accessory bar for the default dimensions (300x80@2.f).
+        mController.showWhenKeyboardIsVisible();
+        verify(mMockKeyboardAccessory).requestShowing();
 
         // Use a height that is too small but with a valid width (e.g. rotated to landscape).
-        simulateOrientationChange(mediator, 2.0f, 600, 20);
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(false));
+        simulateOrientationChange(2.0f, 600, 20);
+        verify(mMockKeyboardAccessory).requestClosing();
+    }
 
-        // Use valid dimension at another density.
-        simulateOrientationChange(mediator, 1.5f, 180, 80);
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(true));
+    @Test
+    public void testDisplaysAccessoryOnlyWhenHorizontalSpaceIsSufficient() {
+        reset(mMockKeyboardAccessory);
 
-        // Now that the accessory is shown, the content area is already smaller due to the bar.
-        setContentAreaDimensions(3.f, 180, (80 - /* bar height = */ 48));
-        mediator.onLayoutChange(mMockContentView, 0, 0, 540, 96, 0, 0, 270, 120);
-        assertThat(mediator.getKeyboardAccessory().isShown(), is(true));
+        addBrowserTab(mMediator, 1234, null);
+        SheetProviderHelper tabHelper = new SheetProviderHelper();
+        mController.registerPasswordProvider(tabHelper.getSheetDataProvider());
+        when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(true);
+        when(mMockKeyboardAccessory.hasContents()).thenReturn(true);
+
+        // Show the accessory bar for the default dimensions (300x80@2.f).
+        mController.showWhenKeyboardIsVisible();
+        verify(mMockKeyboardAccessory).requestShowing();
+
+        // Use a width that is too small (e.g. on tiny phones).
+        simulateOrientationChange(2.0f, 170, 80);
+        verify(mMockKeyboardAccessory).requestClosing();
     }
 
     @Test
     public void testClosingTabDoesntAffectUnitializedComponents() {
-        ManualFillingMediator mediator = mController.getMediatorForTesting();
-
         // A leftover tab is closed before the filling component could pick up the active tab.
-        closeTab(mediator, mock(Tab.class), null);
+        closeBrowserTab(mMediator, mock(Tab.class));
 
         // Without any tab, there should be no state that would allow creating a sheet.
-        assertThat(mediator.getOrCreatePasswordSheet(), is(nullValue()));
+        assertThat(mMediator.getOrCreatePasswordSheet(), is(nullValue()));
     }
 
     @Test
     public void testIsFillingViewShownReturnsTargetValueAheadOfComponentUpdate() {
         // After initialization with one tab, the accessory sheet is closed.
-        KeyboardAccessoryCoordinator accessory =
-                mController.getMediatorForTesting().getKeyboardAccessory();
-        addTab(mController.getMediatorForTesting(), 1234, null);
-        mController.getMediatorForTesting().getOrCreatePasswordSheet();
-        accessory.requestShowing();
+        addBrowserTab(mMediator, 1234, null);
+        mController.registerPasswordProvider(new PropertyProvider<>());
+        when(mMockKeyboardAccessory.hasActiveTab()).thenReturn(false);
         assertThat(mController.isFillingViewShown(null), is(false));
 
         // As soon as active tab and keyboard change, |isFillingViewShown| returns the expected
         // state - even if the sheet component wasn't updated yet.
-        getTabLayout().getModelForTesting().set(ACTIVE_TAB, 0);
+        when(mMockKeyboardAccessory.hasActiveTab()).thenReturn(true);
         when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(false);
         assertThat(mController.isFillingViewShown(null), is(true));
 
         // The layout change impacts the component, but not the coordinator method.
-        mController.getMediatorForTesting().onLayoutChange(null, 0, 0, 0, 0, 0, 0, 0, 0);
+        mMediator.onLayoutChange(null, 0, 0, 0, 0, 0, 0, 0, 0);
         assertThat(mController.isFillingViewShown(null), is(true));
     }
 
@@ -534,20 +684,19 @@
      * @param lastTab A previous mocked {@link Tab} to be hidden. Needs |getId()|. May be null.
      * @return Returns a mock of the newly added {@link Tab}. Provides |getId()|.
      */
-    private Tab addTab(ManualFillingMediator mediator, int id, @Nullable Tab lastTab) {
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
+    private Tab addBrowserTab(ManualFillingMediator mediator, int id, @Nullable Tab lastTab) {
         int lastId = INVALID_TAB_ID;
         if (lastTab != null) {
             lastId = lastTab.getId();
             mediator.getTabObserverForTesting().onHidden(lastTab, TabHidingType.CHANGED_TABS);
-            cache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
+            mCache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
         }
         Tab tab = mock(Tab.class);
         when(tab.getId()).thenReturn(id);
         when(tab.getUserDataHost()).thenReturn(mUserDataHost);
         mLastMockWebContents = mock(WebContents.class);
         when(tab.getWebContents()).thenReturn(mLastMockWebContents);
-        cache.getStateFor(tab).getWebContentsObserverForTesting().wasShown();
+        mCache.getStateFor(tab).getWebContentsObserverForTesting().wasShown();
         when(tab.getContentView()).thenReturn(mMockContentView);
         when(mMockActivity.getActivityTabProvider().getActivityTab()).thenReturn(tab);
         when(mMockTabModelSelector.getCurrentTab()).thenReturn(tab);
@@ -564,16 +713,15 @@
      * @param from The mocked {@link Tab} to be switched from. Needs |getId()|. May be null.
      * @param to The mocked {@link Tab} to be switched to. Needs |getId()|.
      */
-    private void switchTab(ManualFillingMediator mediator, @Nullable Tab from, Tab to) {
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
+    private void switchBrowserTab(ManualFillingMediator mediator, @Nullable Tab from, Tab to) {
         int lastId = INVALID_TAB_ID;
         if (from != null) {
             lastId = from.getId();
             mediator.getTabObserverForTesting().onHidden(from, TabHidingType.CHANGED_TABS);
-            cache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
+            mCache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
         }
         mLastMockWebContents = to.getWebContents();
-        cache.getStateFor(to).getWebContentsObserverForTesting().wasShown();
+        mCache.getStateFor(to).getWebContentsObserverForTesting().wasShown();
         when(mMockTabModelSelector.getCurrentTab()).thenReturn(to);
         mediator.getTabModelObserverForTesting().didSelectTab(to, FROM_USER, lastId);
         mediator.getTabObserverForTesting().onShown(to, FROM_USER);
@@ -583,21 +731,12 @@
      * Simulates destroying the given tab by calling observer events on the given |mediator|.
      * @param mediator The mediator providing the observer instances.
      * @param tabToBeClosed The mocked {@link Tab} to be closed. Needs |getId()|.
-     * @param next A mocked {@link Tab} to be switched to. Needs |getId()|. May be null.
      */
-    private void closeTab(ManualFillingMediator mediator, Tab tabToBeClosed, @Nullable Tab next) {
-        ManualFillingStateCache cache = mediator.getStateCacheForTesting();
+    private void closeBrowserTab(ManualFillingMediator mediator, Tab tabToBeClosed) {
         mediator.getTabModelObserverForTesting().willCloseTab(tabToBeClosed, false);
         mediator.getTabObserverForTesting().onHidden(tabToBeClosed, TabHidingType.CHANGED_TABS);
-        cache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
+        mCache.getStateFor(mLastMockWebContents).getWebContentsObserverForTesting().wasHidden();
         mLastMockWebContents = null;
-        if (next != null) {
-            when(mMockTabModelSelector.getCurrentTab()).thenReturn(next);
-            cache.getStateFor(next).getWebContentsObserverForTesting().wasShown();
-            mLastMockWebContents = next.getWebContents();
-            mediator.getTabModelObserverForTesting().didSelectTab(
-                    next, FROM_CLOSE, tabToBeClosed.getId());
-        }
         mediator.getTabModelObserverForTesting().tabClosureCommitted(tabToBeClosed);
         mediator.getTabObserverForTesting().onDestroyed(tabToBeClosed);
     }
@@ -614,13 +753,11 @@
      * This function initializes mocks and then calls the given mediator events in the order in
      * which a rotation call would trigger them.
      * It mains sets the {@link WebContents} size and calls |onLayoutChange| with the new bounds.
-     * @param mediator The mediator to be called.
      * @param density The logical screen density (e.g. 1.f).
      * @param width The new {@link WebContents} width in dp.
      * @param height The new {@link WebContents} height in dp.
      */
-    private void simulateOrientationChange(
-            ManualFillingMediator mediator, float density, int width, int height) {
+    private void simulateOrientationChange(float density, int width, int height) {
         int oldHeight = mLastMockWebContents.getHeight();
         int oldWidth = mLastMockWebContents.getWidth();
         int newHeight = (int) (density * height);
@@ -628,47 +765,18 @@
         setContentAreaDimensions(density, width, height);
         // A rotation always closes the keyboard for a brief period before reopening it.
         when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(false);
-        mediator.onLayoutChange(
+        mMediator.onLayoutChange(
                 mMockContentView, 0, 0, newWidth, newHeight, 0, 0, oldWidth, oldHeight);
         when(mMockKeyboard.isSoftKeyboardShowing(eq(mMockActivity), any())).thenReturn(true);
-        mediator.onLayoutChange(
+        mMediator.onLayoutChange(
                 mMockContentView, 0, 0, newWidth, newHeight, 0, 0, oldWidth, oldHeight);
     }
 
-    private AccessorySheetData createPasswordData(String text) {
-        AccessorySheetData sheetData =
-                new AccessorySheetData(FallbackSheetType.PASSWORD, "Passwords");
-        UserInfo userInfo = new UserInfo(null);
-        userInfo.addField(new UserInfo.Field("(No username)", "No username", false, null));
-        userInfo.addField(new UserInfo.Field(text, "Password", true, null));
-        sheetData.getUserInfoList().add(userInfo);
-        return sheetData;
-    }
-
-    private String getFirstPassword(ManualFillingMediator mediator) {
-        PasswordAccessorySheetCoordinator passwordSheet = mediator.getOrCreatePasswordSheet();
-        assert passwordSheet != null;
-        assert passwordSheet.getSheetDataPiecesForTesting() != null;
-        assert passwordSheet.getSheetDataPiecesForTesting().size() > 0;
-        assert getType(passwordSheet.getSheetDataPiecesForTesting().get(0)) == PASSWORD_INFO;
-        UserInfo info =
-                (UserInfo) passwordSheet.getSheetDataPiecesForTesting().get(0).getDataPiece();
-        assert info.getFields().size() > 1;
-        return info.getFields().get(1).getDisplayText();
-    }
-
-    private String getFirstKeyboardActionTitle() {
-        int firstNonTabSwitcherAction = 1;
-        if (ChromeFeatureList.isEnabled(ChromeFeatureList.AUTOFILL_KEYBOARD_ACCESSORY)) {
-            firstNonTabSwitcherAction = 0;
-        }
-        return mController.getMediatorForTesting()
-                .getKeyboardAccessory()
-                .getMediatorForTesting()
-                .getModelForTesting()
-                .get(KeyboardAccessoryProperties.BAR_ITEMS)
-                .get(firstNonTabSwitcherAction)
-                .getAction()
-                .getCaption();
+    /**
+     * @return A {@link ManualFillingState} that is never null.
+     */
+    private ManualFillingState getStateForBrowserTab() {
+        assert mLastMockWebContents != null : "In testing, WebContents should never be null!";
+        return mCache.getStateFor(mLastMockWebContents);
     }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
index d125cc74..91c47bf 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/bar_component/KeyboardAccessoryControllerTest.java
@@ -9,6 +9,7 @@
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.instanceOf;
 import static org.junit.Assert.assertThat;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -20,6 +21,8 @@
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.SHEET_TITLE;
 import static org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.VISIBLE;
 
+import android.support.design.widget.TabLayout;
+
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,14 +37,13 @@
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryAction;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryBarContents;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.AccessoryTabType;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.ManualFillingMetricsRecorder;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.AutofillBarItem;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.bar_component.KeyboardAccessoryProperties.BarItem;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.KeyboardAccessoryData.Action;
 import org.chromium.chrome.browser.autofill.keyboard_accessory.data.PropertyProvider;
-import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutView;
+import org.chromium.chrome.browser.autofill.keyboard_accessory.tab_layout_component.KeyboardAccessoryTabLayoutCoordinator;
 import org.chromium.components.autofill.AutofillDelegate;
 import org.chromium.components.autofill.AutofillSuggestion;
 import org.chromium.ui.modelutil.ListObservable;
@@ -68,7 +70,9 @@
     @Mock
     private KeyboardAccessoryModernView mMockView;
     @Mock
-    private KeyboardAccessoryTabLayoutView mMockTabSwitcherView;
+    private KeyboardAccessoryTabLayoutCoordinator mMockTabLayout;
+    @Mock
+    private KeyboardAccessoryCoordinator.TabSwitchingDelegate mMockTabSwitchingDelegate;
     @Mock
     private AutofillDelegate mMockAutofillDelegate;
 
@@ -85,9 +89,10 @@
         MockitoAnnotations.initMocks(this);
         setAutofillFeature(false);
 
-        when(mMockView.getTabLayout()).thenReturn(mMockTabSwitcherView);
+        when(mMockView.getTabLayout()).thenReturn(mock(TabLayout.class));
+        when(mMockTabLayout.getTabSwitchingDelegate()).thenReturn(mMockTabSwitchingDelegate);
         mCoordinator = new KeyboardAccessoryCoordinator(
-                mMockVisibilityDelegate, new FakeViewProvider<>(mMockView));
+                mMockTabLayout, mMockVisibilityDelegate, new FakeViewProvider<>(mMockView));
         mMediator = mCoordinator.getMediatorForTesting();
         mModel = mMediator.getModelForTesting();
     }
@@ -124,8 +129,7 @@
     @Test
     public void testModelNotifiesAboutActionsChangedByProvider() {
         // Set a default tab to prevent visibility changes to trigger now:
-        mCoordinator.setTabs(new KeyboardAccessoryData.Tab[] {new KeyboardAccessoryData.Tab(
-                "Passwords", null, null, 0, AccessoryTabType.PASSWORDS, null)});
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mModel.get(BAR_ITEMS).addObserver(mMockActionListObserver);
 
         PropertyProvider<Action[]> testProvider =
@@ -161,8 +165,7 @@
     public void testModelNotifiesAboutActionsChangedByProviderForRedesign() {
         setAutofillFeature(true);
         // Set a default tab to prevent visibility changes to trigger now:
-        mCoordinator.setTabs(new KeyboardAccessoryData.Tab[] {new KeyboardAccessoryData.Tab(
-                "Passwords", null, null, 0, AccessoryTabType.PASSWORDS, null)});
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mModel.get(BAR_ITEMS).addObserver(mMockActionListObserver);
 
         PropertyProvider<Action[]> testProvider =
@@ -382,7 +385,7 @@
         assertThat(mModel.get(VISIBLE), is(false));
 
         // Adding actions while the keyboard is visible triggers the accessory.
-        mCoordinator.addTab(mTestTab);
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         assertThat(mModel.get(VISIBLE), is(true));
     }
 
@@ -390,12 +393,12 @@
     public void testShowsTitleForActiveTabs() {
         // Add an inactive tab and ensure the sheet title isn't already set.
         mCoordinator.requestShowing();
-        mCoordinator.addTab(mTestTab);
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mModel.set(SHEET_TITLE, "");
         assertThat(mCoordinator.hasActiveTab(), is(false));
 
         // Changing the active tab should also change the title.
-        mCoordinator.getTabLayoutForTesting().setActiveTabForTesting(0);
+        setActiveTab(mTestTab);
         assertThat(mModel.get(SHEET_TITLE), equalTo("Passwords"));
         assertThat(mCoordinator.hasActiveTab(), is(true));
     }
@@ -407,7 +410,7 @@
                 is(0));
 
         // Adding a tab contributes to the tabs and the total bucket.
-        mCoordinator.addTab(mTestTab);
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mCoordinator.requestShowing();
 
         assertThat(getShownMetricsCount(AccessoryBarContents.WITH_TABS), is(1));
@@ -457,7 +460,7 @@
                 is(0));
 
         // First showing contains tabs only.
-        mCoordinator.addTab(mTestTab);
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mCoordinator.requestShowing();
 
         assertThat(getShownMetricsCount(AccessoryBarContents.WITH_TABS), is(1));
@@ -490,7 +493,7 @@
                 is(0));
 
         // Add a tab and show, so the accessory is permanently visible.
-        mCoordinator.addTab(mTestTab);
+        setTabs(new KeyboardAccessoryData.Tab[] {mTestTab});
         mCoordinator.requestShowing();
 
         // Adding an action fills the bar impression bucket and the actions set once.
@@ -522,4 +525,16 @@
         return RecordHistogram.getHistogramValueCountForTesting(
                 KeyboardAccessoryMetricsRecorder.UMA_KEYBOARD_ACCESSORY_BAR_SHOWN, bucket);
     }
+
+    private void setTabs(KeyboardAccessoryData.Tab[] tabs) {
+        mCoordinator.setTabs(tabs);
+        when(mMockTabSwitchingDelegate.hasTabs()).thenReturn(true);
+        mCoordinator.getMediatorForTesting().onTabsChanged();
+    }
+
+    private void setActiveTab(KeyboardAccessoryData.Tab tab) {
+        when(mMockTabSwitchingDelegate.getActiveTab()).thenReturn(tab);
+        when(mMockTabSwitchingDelegate.hasTabs()).thenReturn(true);
+        mCoordinator.getMediatorForTesting().onActiveTabChanged(0);
+    }
 }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
index c895aba5..4d1c37f 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/keyboard_accessory/sheet_component/AccessorySheetControllerTest.java
@@ -6,7 +6,6 @@
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
 import static org.junit.Assert.assertThat;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.times;
@@ -131,98 +130,26 @@
         mModel.get(TABS).addObserver(mTabListObserver);
 
         assertThat(mModel.get(TABS).size(), is(0));
-        mCoordinator.addTab(mTabs[0]);
+        mCoordinator.setTabs(new Tab[] {mTabs[0]});
         verify(mTabListObserver).onItemRangeInserted(mModel.get(TABS), 0, 1);
         assertThat(mModel.get(TABS).size(), is(1));
     }
 
     @Test
-    public void testFirstAddedTabBecomesActiveTab() {
-        mModel.addObserver(mMockPropertyObserver);
-
-        // Initially, there is no active Tab.
-        assertThat(mModel.get(TABS).size(), is(0));
-        assertThat(mCoordinator.getTab(), is(nullValue()));
-
-        // The first tab becomes the active Tab.
-        mCoordinator.addTab(mTabs[0]);
-        verify(mMockPropertyObserver).onPropertyChanged(mModel, ACTIVE_TAB_INDEX);
-        assertThat(mModel.get(TABS).size(), is(1));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(0));
-        assertThat(mCoordinator.getTab(), is(mTabs[0]));
-
-        // A second tab is added but doesn't become automatically active.
-        mCoordinator.addTab(mTabs[1]);
-        verify(mMockPropertyObserver).onPropertyChanged(mModel, ACTIVE_TAB_INDEX);
-        assertThat(mModel.get(TABS).size(), is(2));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(0));
-    }
-
-    @Test
-    public void testDeletingFirstTabActivatesNewFirstTab() {
-        mCoordinator.addTab(mTabs[0]);
-        mCoordinator.addTab(mTabs[1]);
-        mCoordinator.addTab(mTabs[2]);
-        mCoordinator.addTab(mTabs[3]);
-        assertThat(mModel.get(TABS).size(), is(4));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(0));
-
-        mCoordinator.removeTab(mTabs[0]);
-
-        assertThat(mModel.get(TABS).size(), is(3));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(0));
-    }
-
-    @Test
     public void testDeletingFirstAndOnlyTabInvalidatesActiveTab() {
-        mCoordinator.addTab(mTabs[0]);
-        mCoordinator.removeTab(mTabs[0]);
+        mCoordinator.setTabs(new Tab[] {mTabs[0]});
+        mCoordinator.setTabs(new Tab[0]);
 
         assertThat(mModel.get(TABS).size(), is(0));
         assertThat(mModel.get(ACTIVE_TAB_INDEX), is(AccessorySheetProperties.NO_ACTIVE_TAB));
     }
 
     @Test
-    public void testDeletedActiveTabDisappearsAndActivatesLeftNeighbor() {
-        mCoordinator.addTab(mTabs[0]);
-        mCoordinator.addTab(mTabs[1]);
-        mCoordinator.addTab(mTabs[2]);
-        mCoordinator.addTab(mTabs[3]);
-        mModel.set(ACTIVE_TAB_INDEX, 2);
-        mModel.addObserver(mMockPropertyObserver);
-
-        mCoordinator.removeTab(mTabs[2]);
-
-        verify(mMockPropertyObserver).onPropertyChanged(mModel, ACTIVE_TAB_INDEX);
-        assertThat(mModel.get(TABS).size(), is(3));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(1));
-    }
-
-    @Test
-    public void testCorrectsPositionOfActiveTabForDeletedPredecessors() {
-        mCoordinator.addTab(mTabs[0]);
-        mCoordinator.addTab(mTabs[1]);
-        mCoordinator.addTab(mTabs[2]);
-        mCoordinator.addTab(mTabs[3]);
-        mModel.set(ACTIVE_TAB_INDEX, 2);
-        mModel.addObserver(mMockPropertyObserver);
-
-        mCoordinator.removeTab(mTabs[1]);
-
-        verify(mMockPropertyObserver).onPropertyChanged(mModel, ACTIVE_TAB_INDEX);
-        assertThat(mModel.get(TABS).size(), is(3));
-        assertThat(mModel.get(ACTIVE_TAB_INDEX), is(1));
-    }
-
-    @Test
     public void testDoesntChangePositionOfActiveTabForDeletedSuccessors() {
-        mCoordinator.addTab(mTabs[0]);
-        mCoordinator.addTab(mTabs[1]);
-        mCoordinator.addTab(mTabs[2]);
-        mCoordinator.addTab(mTabs[3]);
+        mCoordinator.setTabs(mTabs);
         mModel.set(ACTIVE_TAB_INDEX, 2);
 
-        mCoordinator.removeTab(mTabs[3]);
+        mCoordinator.setTabs(new Tab[] {mTabs[0], mTabs[1], mTabs[2]});
 
         assertThat(mModel.get(TABS).size(), is(3));
         assertThat(mModel.get(ACTIVE_TAB_INDEX), is(2));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
index 5c8951b5..653f79c 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninManagerTest.java
@@ -19,18 +19,20 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.MockitoAnnotations.initMocks;
 
 import android.accounts.Account;
-import android.content.Context;
 
 import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.mockito.Spy;
+import org.mockito.Mock;
 import org.robolectric.annotation.Config;
 
 import org.chromium.base.ContextUtils;
 import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
 import org.chromium.components.signin.AccountManagerFacade;
 import org.chromium.components.signin.AccountTrackerService;
 import org.chromium.components.sync.AndroidSyncSettings;
@@ -42,40 +44,30 @@
 @RunWith(BaseRobolectricTestRunner.class)
 @Config(manifest = Config.NONE)
 public class SigninManagerTest {
-    /**
-     * Overrides the native methods called during SigninManager construction.
-     * Other native* methods can be overridden using Spy.
-     */
-    static class TestableSigninManager extends SigninManager {
-        TestableSigninManager(Context context, AccountTrackerService accountTrackerService,
-                AndroidSyncSettings androidSyncSettings) {
-            super(context, accountTrackerService, androidSyncSettings);
-        }
+    @Rule
+    public JniMocker mocker = new JniMocker();
 
-        @Override
-        long nativeInit() {
-            return 0;
-        }
-
-        @Override
-        boolean nativeIsSigninAllowedByPolicy(long nativeSigninManagerAndroid) {
-            return true;
-        }
-    }
+    @Mock
+    SigninManager.Natives mNativeMock;
 
     private AccountTrackerService mAccountTrackerService;
-    @Spy
-    private TestableSigninManager mSigninManager;
+    private SigninManager mSigninManager;
 
     @Before
     public void setUp() {
+        initMocks(this);
+
+        mocker.mock(SigninManagerJni.TEST_HOOKS, mNativeMock);
+        doReturn(0l).when(mNativeMock).init(any());
+        doReturn(true).when(mNativeMock).isSigninAllowedByPolicy(any(), anyLong());
+
         mAccountTrackerService = mock(AccountTrackerService.class);
         AndroidSyncSettings androidSyncSettings = mock(AndroidSyncSettings.class);
 
-        mSigninManager = spy(new TestableSigninManager(
+        mSigninManager = spy(new SigninManager(
                 ContextUtils.getApplicationContext(), mAccountTrackerService, androidSyncSettings));
 
-        // SinginManager interacts with AndroidSyncSettings, but its not the focus
+        // SigninManager interacts with AndroidSyncSettings, but its not the focus
         // of this test. Using MockSyncContentResolver reduces burden of test setup.
         AndroidSyncSettings.overrideForTests(new MockSyncContentResolverDelegate(), null);
     }
@@ -84,65 +76,65 @@
     public void signOutFromJavaWithManagedDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mSigninManager).nativeSignOut(anyLong(), anyInt());
-        doNothing().when(mSigninManager).nativeWipeProfileData(anyLong());
-        doNothing().when(mSigninManager).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        doNothing().when(mNativeMock).signOut(any(), anyLong(), anyInt());
+        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong());
         // See verification of nativeWipeProfileData below.
-        doReturn("TestDomain").when(mSigninManager).nativeGetManagementDomain(anyLong());
+        doReturn("TestDomain").when(mNativeMock).getManagementDomain(any(), anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
 
         // nativeSignOut should be called *before* clearing any account data.
         // http://crbug.com/589028
-        verify(mSigninManager, times(1)).nativeSignOut(anyLong(), eq(SignoutReason.SIGNOUT_TEST));
-        verify(mSigninManager, never()).nativeWipeGoogleServiceWorkerCaches(anyLong());
-        verify(mSigninManager, never()).nativeWipeProfileData(anyLong());
+        verify(mNativeMock, times(1)).signOut(any(), anyLong(), eq(SignoutReason.SIGNOUT_TEST));
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong());
+        verify(mNativeMock, never()).wipeProfileData(any(), anyLong());
 
         // Simulate native callback to trigger clearing of account data.
         mSigninManager.onNativeSignOut();
 
         // Sign-out should wipe all profile data when user has managed domain.
-        verify(mSigninManager, times(1)).nativeWipeProfileData(anyLong());
-        verify(mSigninManager, never()).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong());
     }
 
     @Test
     public void signOutFromJavaWithNullDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mSigninManager).nativeSignOut(anyLong(), anyInt());
-        doNothing().when(mSigninManager).nativeWipeProfileData(anyLong());
-        doNothing().when(mSigninManager).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        doNothing().when(mNativeMock).signOut(any(), anyLong(), anyInt());
+        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong());
         // See verification of nativeWipeGoogleServiceWorkerCaches below.
-        doReturn(null).when(mSigninManager).nativeGetManagementDomain(anyLong());
+        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
 
         // nativeSignOut should be called *before* clearing any account data.
         // http://crbug.com/589028
-        verify(mSigninManager, times(1)).nativeSignOut(anyLong(), eq(SignoutReason.SIGNOUT_TEST));
-        verify(mSigninManager, never()).nativeWipeGoogleServiceWorkerCaches(anyLong());
-        verify(mSigninManager, never()).nativeWipeProfileData(anyLong());
+        verify(mNativeMock, times(1)).signOut(any(), anyLong(), eq(SignoutReason.SIGNOUT_TEST));
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong());
+        verify(mNativeMock, never()).wipeProfileData(any(), anyLong());
 
         // Simulate native callback to trigger clearing of account data.
         mSigninManager.onNativeSignOut();
 
         // Sign-out should only clear the service worker cache when the domain is null.
-        verify(mSigninManager, never()).nativeWipeProfileData(anyLong());
-        verify(mSigninManager, times(1)).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        verify(mNativeMock, never()).wipeProfileData(any(), anyLong());
+        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(any(), anyLong());
     }
 
     @Test
     public void signOutFromNativeWithManagedDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mSigninManager).nativeSignOut(anyLong(), anyInt());
-        doNothing().when(mSigninManager).nativeWipeProfileData(anyLong());
-        doNothing().when(mSigninManager).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        doNothing().when(mNativeMock).signOut(any(), anyLong(), anyInt());
+        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong());
         // See verification of nativeWipeProfileData below.
-        doReturn("TestDomain").when(mSigninManager).nativeGetManagementDomain(anyLong());
+        doReturn("TestDomain").when(mNativeMock).getManagementDomain(any(), anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.onNativeSignOut();
@@ -150,22 +142,22 @@
         // nativeSignOut should only be called when signOut() is triggered on
         // the Java side of the JNI boundary. This test instead initiates sign-out
         // from the native side.
-        verify(mSigninManager, never()).nativeSignOut(anyLong(), anyInt());
+        verify(mNativeMock, never()).signOut(any(), anyLong(), anyInt());
 
         // Sign-out should wipe profile data when user has managed domain.
-        verify(mSigninManager, times(1)).nativeWipeProfileData(anyLong());
-        verify(mSigninManager, never()).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        verify(mNativeMock, times(1)).wipeProfileData(any(), anyLong());
+        verify(mNativeMock, never()).wipeGoogleServiceWorkerCaches(any(), anyLong());
     }
 
     @Test
     public void signOutFromNativeWithNullDomain() {
         // Stub out various native calls. Some of these are verified as never called
         // and those stubs simply allow that verification to catch any issues.
-        doNothing().when(mSigninManager).nativeSignOut(anyLong(), anyInt());
-        doNothing().when(mSigninManager).nativeWipeProfileData(anyLong());
-        doNothing().when(mSigninManager).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        doNothing().when(mNativeMock).signOut(any(), anyLong(), anyInt());
+        doNothing().when(mNativeMock).wipeProfileData(any(), anyLong());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong());
         // See verification of nativeWipeGoogleServiceWorkerCaches below.
-        doReturn(null).when(mSigninManager).nativeGetManagementDomain(anyLong());
+        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
 
         // Trigger the sign out flow!
         mSigninManager.onNativeSignOut();
@@ -173,11 +165,11 @@
         // nativeSignOut should only be called when signOut() is triggered on
         // the Java side of the JNI boundary. This test instead initiates sign-out
         // from the native side.
-        verify(mSigninManager, never()).nativeSignOut(anyLong(), anyInt());
+        verify(mNativeMock, never()).signOut(any(), anyLong(), anyInt());
 
         // Sign-out should only clear the service worker cache when the domain is null.
-        verify(mSigninManager, never()).nativeWipeProfileData(anyLong());
-        verify(mSigninManager, times(1)).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        verify(mNativeMock, never()).wipeProfileData(any(), anyLong());
+        verify(mNativeMock, times(1)).wipeGoogleServiceWorkerCaches(any(), anyLong());
     }
 
     @Test
@@ -194,9 +186,11 @@
         doAnswer(invocation -> {
             mSigninManager.onNativeSignOut();
             return null;
-        }).when(mSigninManager).nativeSignOut(anyLong(), anyInt());
-        doReturn(null).when(mSigninManager).nativeGetManagementDomain(anyLong());
-        doNothing().when(mSigninManager).nativeWipeGoogleServiceWorkerCaches(anyLong());
+        })
+                .when(mNativeMock)
+                .signOut(any(), anyLong(), anyInt());
+        doReturn(null).when(mNativeMock).getManagementDomain(any(), anyLong());
+        doNothing().when(mNativeMock).wipeGoogleServiceWorkerCaches(any(), anyLong());
 
         mSigninManager.signOut(SignoutReason.SIGNOUT_TEST);
         assertTrue(mSigninManager.isOperationInProgress());
@@ -215,11 +209,11 @@
         doReturn(true).when(mAccountTrackerService).checkAndSeedSystemAccounts();
         // Request that policy is loaded. It will pause sign-in until onPolicyCheckedBeforeSignIn is
         // invoked.
-        doReturn(true).when(mSigninManager).nativeShouldLoadPolicyForUser(any());
-        doNothing().when(mSigninManager).nativeCheckPolicyBeforeSignIn(anyLong(), any());
+        doReturn(true).when(mNativeMock).shouldLoadPolicyForUser(any());
+        doNothing().when(mNativeMock).checkPolicyBeforeSignIn(any(), anyLong(), any());
 
         doReturn(true).when(mSigninManager).isSigninSupported();
-        doNothing().when(mSigninManager).nativeOnSignInCompleted(anyLong(), any());
+        doNothing().when(mNativeMock).onSignInCompleted(any(), anyLong(), any());
         doNothing().when(mSigninManager).logInSignedInUser();
 
         mSigninManager.onFirstRunCheckDone(); // Allow sign-in.
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index 39c5b8d..f5b7931e 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-75.0.3752.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
+chromeos-chrome-amd64-75.0.3753.0_rc-r1-merged.afdo.bz2
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index cb82309..63bf04f1 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -1513,8 +1513,6 @@
     "signin/account_consistency_mode_manager.h",
     "signin/account_consistency_mode_manager_factory.cc",
     "signin/account_consistency_mode_manager_factory.h",
-    "signin/account_fetcher_service_factory.cc",
-    "signin/account_fetcher_service_factory.h",
     "signin/account_investigator_factory.cc",
     "signin/account_investigator_factory.h",
     "signin/account_reconcilor_factory.cc",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 9a3961d..46350189 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -2152,12 +2152,6 @@
     {"user-activation-v2", flag_descriptions::kUserActivationV2Name,
      flag_descriptions::kUserActivationV2Description, kOsAll,
      FEATURE_VALUE_TYPE(features::kUserActivationV2)},
-#if BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
-    {"enable-webrtc-h264-with-openh264-ffmpeg",
-     flag_descriptions::kWebrtcH264WithOpenh264FfmpegName,
-     flag_descriptions::kWebrtcH264WithOpenh264FfmpegDescription, kOsDesktop,
-     FEATURE_VALUE_TYPE(content::kWebRtcH264WithOpenH264FFmpeg)},
-#endif  // BUILDFLAG(RTC_USE_H264) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS)
 #if defined(OS_ANDROID)
     {"offlining-recent-pages", flag_descriptions::kOffliningRecentPagesName,
      flag_descriptions::kOffliningRecentPagesDescription, kOsAndroid,
@@ -3715,11 +3709,6 @@
      FEATURE_VALUE_TYPE(chromeos::assistant::features::kAssistantAppSupport)},
 #endif  // defined(OS_CHROMEOS)
 
-    {"enable-blink-heap-unified-garbage-collection",
-     flag_descriptions::kEnableBlinkHeapUnifiedGarbageCollectionName,
-     flag_descriptions::kEnableBlinkHeapUnifiedGarbageCollectionDescription,
-     kOsAll, FEATURE_VALUE_TYPE(features::kBlinkHeapUnifiedGarbageCollection)},
-
     {"enable-filesystem-in-incognito",
      flag_descriptions::kEnableFilesystemInIncognitoName,
      flag_descriptions::kEnableFilesystemInIncognitoDescription, kOsAll,
@@ -4038,6 +4027,13 @@
      flag_descriptions::kSkiaRendererDescription, kOsLinux | kOsAndroid,
      FEATURE_VALUE_TYPE(features::kUseSkiaRenderer)},
 
+#if defined(OS_CHROMEOS)
+    {"in-session-password-change",
+     flag_descriptions::kInSessionPasswordChangeName,
+     flag_descriptions::kInSessionPasswordChangeDescription, kOsCrOS,
+     FEATURE_VALUE_TYPE(features::kInSessionPasswordChange)},
+#endif  // OS_CHROMEOS
+
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
     // Histograms" in tools/metrics/histograms/README.md (run the
@@ -4078,6 +4074,14 @@
       channel == version_info::Channel::STABLE) {
     return true;
   }
+
+  // Don't expose in-session password change on stable and beta channel.
+  if (!strcmp("in-session-password-change", entry.internal_name) &&
+      channel != version_info::Channel::DEV &&
+      channel != version_info::Channel::CANARY &&
+      channel != version_info::Channel::UNKNOWN) {
+    return true;
+  }
 #endif  // defined(OS_CHROMEOS)
 
   // data-reduction-proxy-lo-fi and enable-data-reduction-proxy-lite-page
diff --git a/chrome/browser/android/autofill_assistant/ui_controller_android.cc b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
index d13bed5..a876d02 100644
--- a/chrome/browser/android/autofill_assistant/ui_controller_android.cc
+++ b/chrome/browser/android/autofill_assistant/ui_controller_android.cc
@@ -622,7 +622,7 @@
   auto jdetails = Java_AssistantDetails_create(
       env, base::android::ConvertUTF8ToJavaString(env, proto.title()),
       base::android::ConvertUTF8ToJavaString(env, proto.image_url()),
-      proto.show_image_placeholder(),
+      proto.show_attribution(), proto.show_image_placeholder(),
       base::android::ConvertUTF8ToJavaString(env, proto.total_price_label()),
       base::android::ConvertUTF8ToJavaString(env, proto.total_price()),
       base::android::ConvertUTF8ToJavaString(env, details->GetDatetime()),
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc
index 4247ff2..6d7a34e 100644
--- a/chrome/browser/android/signin/signin_manager_android.cc
+++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -50,6 +50,11 @@
   profile->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername);
 }
 
+// Returns whether the user is a managed user or not.
+bool ShouldLoadPolicyForUser(const std::string& username) {
+  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
+}
+
 // A BrowsingDataRemover::Observer that clears Profile data and then invokes
 // a callback and deletes itself. It can be configured to delete all data
 // (for enterprise users) or only Google's service workers (for all users).
@@ -116,12 +121,6 @@
   DISALLOW_COPY_AND_ASSIGN(ProfileDataRemover);
 };
 
-void UserManagementDomainFetched(
-    base::android::ScopedJavaGlobalRef<jobject> callback,
-    const std::string& dm_token, const std::string& client_id) {
-  base::android::RunBooleanCallbackAndroid(callback, !dm_token.empty());
-}
-
 }  // namespace
 
 SigninManagerAndroid::SigninManagerAndroid(JNIEnv* env, jobject obj)
@@ -188,9 +187,8 @@
   Java_SigninManager_onPolicyFetchedBeforeSignIn(env, java_signin_manager_);
 }
 
-void SigninManagerAndroid::AbortSignIn(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& obj) {
+void SigninManagerAndroid::AbortSignIn(JNIEnv* env,
+                                       const JavaParamRef<jobject>& obj) {
   policy::UserPolicySigninService* service =
       policy::UserPolicySigninServiceFactory::GetForProfile(profile_);
   service->ShutdownUserCloudPolicyManager();
@@ -356,37 +354,47 @@
 
 static jboolean JNI_SigninManager_ShouldLoadPolicyForUser(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_username) {
   std::string username =
       base::android::ConvertJavaStringToUTF8(env, j_username);
-  return !policy::BrowserPolicyConnector::IsNonEnterpriseUser(username);
+  return ShouldLoadPolicyForUser(username);
 }
 
 static void JNI_SigninManager_IsUserManaged(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_username,
     const JavaParamRef<jobject>& j_callback) {
   base::android::ScopedJavaGlobalRef<jobject> callback(env, j_callback);
-
-  Profile* profile = ProfileManager::GetActiveUserProfile();
   std::string username =
       base::android::ConvertJavaStringToUTF8(env, j_username);
+  if (!ShouldLoadPolicyForUser(username)) {
+    base::android::RunBooleanCallbackAndroid(callback, false);
+    return;
+  }
+
+  Profile* profile = ProfileManager::GetActiveUserProfile();
   policy::UserPolicySigninService* service =
       policy::UserPolicySigninServiceFactory::GetForProfile(profile);
   service->RegisterForPolicyWithAccountId(
       username,
       IdentityManagerFactory::GetForProfile(profile)
           ->FindAccountInfoForAccountWithRefreshTokenByEmailAddress(username)
-          .value()
+          .value_or(AccountInfo{})
           .account_id,
-      base::Bind(&UserManagementDomainFetched, callback));
+      // TODO: if UserPolicySigninService::PolicyRegistrationCallback is changed
+      // to base::OnceCallback, change this to base::BindOnce; otherwise remove
+      // this comment. See https://crbug.com/948098 for more details.
+      base::BindRepeating(
+          [](base::android::ScopedJavaGlobalRef<jobject> callback,
+             const std::string& dm_token, const std::string& client_id) {
+            base::android::RunBooleanCallbackAndroid(callback,
+                                                     !dm_token.empty());
+          },
+          callback));
 }
 
 base::android::ScopedJavaLocalRef<jstring> JNI_SigninManager_ExtractDomainName(
     JNIEnv* env,
-    const JavaParamRef<jobject>& obj,
     const JavaParamRef<jstring>& j_email) {
   std::string email = base::android::ConvertJavaStringToUTF8(env, j_email);
   std::string domain = gaia::ExtractDomainName(email);
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd
index fb96616..14c1ec2 100644
--- a/chrome/browser/browser_resources.grd
+++ b/chrome/browser/browser_resources.grd
@@ -518,6 +518,11 @@
         <include name="IDR_ACCOUNT_MANAGER_WELCOME_2X_PNG" file="resources\chromeos\account_manager_welcome_2x.png" type="BINDATA" compress="gzip" />
         <include name="IDR_ACCOUNT_MANAGER_WELCOME_GOOGLE_LOGO_SVG" file="resources\chromeos\googleg.svg" type="BINDATA" compress="gzip" />
 
+        <include name="IDR_PASSWORD_CHANGE_HTML" file="resources\chromeos\password_change\password_change.html" flattenhtml="true" type="BINDATA" />
+        <include name="IDR_PASSWORD_CHANGE_JS" file="resources\chromeos\password_change\password_change.js" flattenhtml="true" type="BINDATA" />
+        <include name="IDR_PASSWORD_CHANGE_CSS" file="resources\chromeos\password_change\password_change.css" flattenhtml="true" type="BINDATA" />
+        <include name="IDR_PASSWORD_CHANGE_AUTHENTICATOR_JS" file="resources\gaia_auth_host\password_change_authenticator.js" flattenhtml="true" type="BINDATA" />
+
         <include name="IDR_CROSH_BUILTIN_MANIFEST" file="resources\chromeos\crosh_builtin\manifest.json" type="BINDATA" />
         <include name="IDR_CRYPTOHOME_HTML" file="resources\chromeos\cryptohome.html" flattenhtml="true" type="BINDATA" />
         <include name="IDR_CRYPTOHOME_JS" file="resources\chromeos\cryptohome.js" type="BINDATA" />
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn
index 27e4ef5..e1a3cf9 100644
--- a/chrome/browser/chromeos/BUILD.gn
+++ b/chrome/browser/chromeos/BUILD.gn
@@ -1609,6 +1609,8 @@
     "policy/heartbeat_scheduler.h",
     "policy/hostname_handler.cc",
     "policy/hostname_handler.h",
+    "policy/lock_to_single_user_manager.cc",
+    "policy/lock_to_single_user_manager.h",
     "policy/login_profile_policy_provider.cc",
     "policy/login_profile_policy_provider.h",
     "policy/minimum_version_policy_handler.cc",
@@ -2440,6 +2442,7 @@
     "policy/fake_affiliated_invalidation_service_provider.h",
     "policy/heartbeat_scheduler_unittest.cc",
     "policy/hostname_handler_unittest.cc",
+    "policy/lock_to_single_user_manager_unittest.cc",
     "policy/network_configuration_updater_unittest.cc",
     "policy/off_hours/device_off_hours_controller_unittest.cc",
     "policy/off_hours/off_hours_policy_applier_unittest.cc",
diff --git a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
index 6ef159bf..46cfc0f 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
+++ b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.cc
@@ -9,7 +9,10 @@
 #include "base/bind.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
+#include "ui/base/ime/chromeos/ime_keymap.h"
 #include "ui/base/ime/ime_bridge.h"
+#include "ui/events/keycodes/dom/keycode_converter.h"
+#include "ui/events/keycodes/keyboard_code_conversion.h"
 #include "ui/events/keycodes/keyboard_codes.h"
 
 namespace arc {
@@ -234,6 +237,27 @@
   client->SetEditableSelectionRange(new_selection_range);
 }
 
+void InputConnectionImpl::SendKeyEvent(mojom::KeyEventDataPtr data_ptr) {
+  chromeos::InputMethodEngine::KeyboardEvent event;
+  if (data_ptr->pressed)
+    event.type = "keydown";
+  else
+    event.type = "keyup";
+
+  ui::KeyboardCode key_code = static_cast<ui::KeyboardCode>(data_ptr->key_code);
+  ui::DomCode dom_code = ui::UsLayoutKeyboardCodeToDomCode(key_code);
+
+  event.key = ui::KeycodeConverter::DomCodeToCodeString(dom_code);
+  event.code = ui::KeyboardCodeToDomKeycode(key_code);
+  event.key_code = data_ptr->key_code;
+  event.alt_key = data_ptr->is_alt_down;
+  event.ctrl_key = data_ptr->is_control_down;
+  event.shift_key = data_ptr->is_shift_down;
+  event.caps_lock = data_ptr->is_capslock_on;
+
+  ime_engine_->SendKeyEvents(input_context_id_, {event});
+}
+
 void InputConnectionImpl::StartStateUpdateTimer() {
   // It's safe to use Unretained() here because the timer is automatically
   // canceled when it go out of scope.
diff --git a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
index b3e85b8f..5c65d89 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
+++ b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl.h
@@ -48,6 +48,7 @@
   void RequestTextInputState(
       mojom::InputConnection::RequestTextInputStateCallback callback) override;
   void SetSelection(const gfx::Range& new_selection_range) override;
+  void SendKeyEvent(mojom::KeyEventDataPtr data_ptr) override;
 
  private:
   // Starts the timer to send new TextInputState.
diff --git a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl_unittest.cc b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl_unittest.cc
index b47782c..08cc22f 100644
--- a/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl_unittest.cc
+++ b/chrome/browser/chromeos/arc/input_method_manager/input_connection_impl_unittest.cc
@@ -14,6 +14,7 @@
 #include "ui/base/ime/ime_bridge.h"
 #include "ui/base/ime/mock_ime_input_context_handler.h"
 #include "ui/base/ime/mock_input_method.h"
+#include "ui/events/keycodes/dom/dom_codes.h"
 
 namespace arc {
 
@@ -279,4 +280,56 @@
   engine()->FocusOut();
 }
 
+TEST_F(InputConnectionImplTest, SendKeyEvent) {
+  auto connection = createNewConnection(1);
+  engine()->FocusIn(context());
+
+  context_handler()->Reset();
+
+  {
+    mojom::KeyEventDataPtr data = mojom::KeyEventData::New();
+    data->pressed = true;
+    data->key_code = ui::VKEY_RETURN;
+    data->is_shift_down = false;
+    data->is_control_down = false;
+    data->is_alt_down = false;
+    data->is_capslock_on = false;
+
+    connection->SendKeyEvent(std::move(data));
+    EXPECT_EQ(1, context_handler()->send_key_event_call_count());
+    const auto& event = context_handler()->last_sent_key_event();
+    EXPECT_EQ(ui::VKEY_RETURN, event.key_code());
+    EXPECT_EQ(ui::DomCode::ENTER, event.code());
+    EXPECT_EQ("Enter", event.GetCodeString());
+    EXPECT_EQ(ui::ET_KEY_PRESSED, event.type());
+    EXPECT_EQ(0, ui::EF_SHIFT_DOWN & event.flags());
+    EXPECT_EQ(0, ui::EF_CONTROL_DOWN & event.flags());
+    EXPECT_EQ(0, ui::EF_ALT_DOWN & event.flags());
+    EXPECT_EQ(0, ui::EF_CAPS_LOCK_ON & event.flags());
+  }
+
+  {
+    mojom::KeyEventDataPtr data = mojom::KeyEventData::New();
+    data->pressed = false;
+    data->key_code = ui::VKEY_A;
+    data->is_shift_down = true;
+    data->is_control_down = true;
+    data->is_alt_down = true;
+    data->is_capslock_on = true;
+
+    connection->SendKeyEvent(std::move(data));
+    EXPECT_EQ(2, context_handler()->send_key_event_call_count());
+    const auto& event = context_handler()->last_sent_key_event();
+    EXPECT_EQ(ui::VKEY_A, event.key_code());
+    EXPECT_EQ(ui::DomCode::US_A, event.code());
+    EXPECT_EQ("KeyA", event.GetCodeString());
+    EXPECT_EQ(ui::ET_KEY_RELEASED, event.type());
+    EXPECT_NE(0, ui::EF_SHIFT_DOWN & event.flags());
+    EXPECT_NE(0, ui::EF_CONTROL_DOWN & event.flags());
+    EXPECT_NE(0, ui::EF_ALT_DOWN & event.flags());
+    EXPECT_NE(0, ui::EF_CAPS_LOCK_ON & event.flags());
+  }
+  engine()->FocusOut();
+}
+
 }  // namespace arc
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
index 9c533d5..4ab89cd 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc
@@ -85,6 +85,7 @@
 #include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
 #include "chrome/browser/chromeos/policy/device_local_account.h"
+#include "chrome/browser/chromeos/policy/lock_to_single_user_manager.h"
 #include "chrome/browser/chromeos/power/auto_screen_brightness/controller.h"
 #include "chrome/browser/chromeos/power/freezer_cgroup_process_manager.h"
 #include "chrome/browser/chromeos/power/idle_action_warning_observer.h"
@@ -680,6 +681,9 @@
           DBusThreadManager::Get()->GetDebugDaemonClient(),
           g_browser_process->local_state());
 
+  lock_to_single_user_manager_ =
+      std::make_unique<policy::LockToSingleUserManager>();
+
   ChromeBrowserMainPartsLinux::PreMainMessageLoopRun();
 }
 
@@ -1110,6 +1114,7 @@
   diagnosticsd_manager_.reset();
   auto_screen_brightness_controller_.reset();
   dark_resume_controller_.reset();
+  lock_to_single_user_manager_.reset();
 
   // Detach D-Bus clients before DBusThreadManager is shut down.
   idle_action_warning_observer_.reset();
diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.h b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
index a5fbb05..a9d6cec 100644
--- a/chrome/browser/chromeos/chrome_browser_main_chromeos.h
+++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.h
@@ -27,6 +27,10 @@
 class VoiceInteractionControllerClient;
 }  // namespace arc
 
+namespace policy {
+class LockToSingleUserManager;
+}  // namespace policy
+
 #if BUILDFLAG(ENABLE_CROS_ASSISTANT)
 class AssistantClient;
 #endif
@@ -166,6 +170,8 @@
   std::unique_ptr<chromeos::system::DarkResumeController>
       dark_resume_controller_;
 
+  std::unique_ptr<policy::LockToSingleUserManager> lock_to_single_user_manager_;
+
   DISALLOW_COPY_AND_ASSIGN(ChromeBrowserMainPartsChromeos);
 };
 
diff --git a/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc b/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc
index 26a03498..8b060a5e 100644
--- a/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc
+++ b/chrome/browser/chromeos/crostini/crostini_package_service_unittest.cc
@@ -24,8 +24,6 @@
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/fake_cicerone_client.h"
 #include "chromeos/dbus/vm_applications/apps.pb.h"
-#include "chromeos/disks/disk_mount_manager.h"
-#include "chromeos/disks/mock_disk_mount_manager.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/test/test_browser_thread_bundle.h"
@@ -40,7 +38,6 @@
 using ::chromeos::DBusMethodCallback;
 using ::chromeos::DBusThreadManager;
 using ::chromeos::FakeCiceroneClient;
-using ::chromeos::disks::MockDiskMountManager;
 using ::testing::_;
 using ::testing::Invoke;
 using ::testing::IsEmpty;
@@ -155,13 +152,6 @@
         DBusThreadManager::Get()->GetCiceroneClient());
     ASSERT_TRUE(fake_cicerone_client_);
 
-    mock_disk_mount_manager_ = new MockDiskMountManager;
-    ON_CALL(*mock_disk_mount_manager_, MountPath(_, _, _, _, _, _))
-        .WillByDefault(Invoke(
-            this,
-            &CrostiniPackageServiceTest::HandleDiskMountManagerMountPath));
-    chromeos::disks::DiskMountManager::InitializeForTesting(
-        mock_disk_mount_manager_);
     test_browser_thread_bundle_ =
         std::make_unique<content::TestBrowserThreadBundle>(
             base::test::ScopedTaskEnvironment::MainThreadType::UI,
@@ -194,8 +184,6 @@
     crostini_test_helper_.reset();
     profile_.reset();
     test_browser_thread_bundle_.reset();
-    chromeos::disks::DiskMountManager::Shutdown();
-    mock_disk_mount_manager_ = nullptr;  // Destroyed in Shutdown()
     DBusThreadManager::Shutdown();
   }
 
@@ -212,29 +200,6 @@
   const std::string kDifferentContainerApp2Id;  // App_id for app with
                                                 // kDifferentContainerApp2FileId
 
-  // Called when our MockDiskMountManager has its MountPath called. Needed so
-  // that CrostiniManager::CrostiniRestarter::OnMountEvent gets called properly
-  // after CrostiniManager::CrostiniRestarter::GetContainerSshKeysFinished.
-  void HandleDiskMountManagerMountPath(
-      const std::string& source_path,
-      const std::string& source_format,
-      const std::string& mount_label,
-      const std::vector<std::string>& mount_options,
-      chromeos::MountType type,
-      chromeos::MountAccessMode access_mode) {
-    if (mock_disk_mount_manager_) {
-      chromeos::disks::DiskMountManager::MountPointInfo info(
-          source_path, "/tmp/fake_mount_path", type,
-          chromeos::disks::MOUNT_CONDITION_NONE);
-      base::PostTaskWithTraits(
-          FROM_HERE, {content::BrowserThread::UI},
-          base::BindOnce(&MockDiskMountManager::NotifyMountEvent,
-                         base::Unretained(mock_disk_mount_manager_),
-                         chromeos::disks::DiskMountManager::MOUNTING,
-                         chromeos::MOUNT_ERROR_NONE, info));
-    }
-  }
-
   UninstallPackageProgressSignal MakeUninstallSignal(
       const UninstallPackageOwningFileRequest& request) {
     UninstallPackageProgressSignal signal;
@@ -332,9 +297,6 @@
   // Owned by DBusThreadManager
   FakeCiceroneClient* fake_cicerone_client_ = nullptr;
 
-  // Owned by chromeos::disks::DiskMountManager
-  MockDiskMountManager* mock_disk_mount_manager_ = nullptr;
-
   std::unique_ptr<content::TestBrowserThreadBundle> test_browser_thread_bundle_;
   std::unique_ptr<TestingProfile> profile_;
   std::unique_ptr<CrostiniTestHelper> crostini_test_helper_;
diff --git a/chrome/browser/chromeos/network_change_manager_client.cc b/chrome/browser/chromeos/network_change_manager_client.cc
index c3800e7c..f64f37f 100644
--- a/chrome/browser/chromeos/network_change_manager_client.cc
+++ b/chrome/browser/chromeos/network_change_manager_client.cc
@@ -12,7 +12,6 @@
 #include "chromeos/network/network_state_handler.h"
 #include "content/public/browser/network_service_instance.h"
 #include "content/public/common/network_service_util.h"
-#include "net/base/network_change_notifier.h"
 #include "net/base/network_change_notifier_posix.h"
 #include "services/network/public/mojom/network_service.mojom.h"
 
@@ -20,8 +19,8 @@
 
 NetworkChangeManagerClient::NetworkChangeManagerClient(
     net::NetworkChangeNotifierPosix* network_change_notifier)
-    : connection_type_(net::NetworkChangeNotifier::GetConnectionType()),
-      connection_subtype_(net::NetworkChangeNotifier::GetConnectionSubtype()),
+    : connection_type_(net::NetworkChangeNotifier::CONNECTION_NONE),
+      connection_subtype_(net::NetworkChangeNotifier::SUBTYPE_NONE),
       network_change_notifier_(network_change_notifier) {
   PowerManagerClient::Get()->AddObserver(this);
   NetworkHandler::Get()->network_state_handler()->AddObserver(this, FROM_HERE);
diff --git a/chrome/browser/chromeos/network_change_manager_client.h b/chrome/browser/chromeos/network_change_manager_client.h
index 36cc507f..9731798 100644
--- a/chrome/browser/chromeos/network_change_manager_client.h
+++ b/chrome/browser/chromeos/network_change_manager_client.h
@@ -42,8 +42,6 @@
   friend class NetworkChangeManagerClientUpdateTest;
   FRIEND_TEST_ALL_PREFIXES(NetworkChangeManagerClientTest,
                            ConnectionTypeFromShill);
-  FRIEND_TEST_ALL_PREFIXES(NetworkChangeManagerClientTest,
-                           NetworkChangeNotifierConnectionTypeUpdated);
 
   void ConnectToNetworkChangeManager();
   void ReconnectToNetworkChangeManager();
diff --git a/chrome/browser/chromeos/network_change_manager_client_unittest.cc b/chrome/browser/chromeos/network_change_manager_client_unittest.cc
index 585ee71..23e42a6 100644
--- a/chrome/browser/chromeos/network_change_manager_client_unittest.cc
+++ b/chrome/browser/chromeos/network_change_manager_client_unittest.cc
@@ -12,7 +12,6 @@
 #include "base/strings/string_split.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
 #include "chromeos/dbus/power/power_manager_client.h"
-#include "chromeos/dbus/shill_service_client.h"
 #include "chromeos/network/network_handler.h"
 #include "chromeos/network/network_state.h"
 #include "content/public/test/test_browser_thread_bundle.h"
@@ -107,43 +106,6 @@
   }
 }
 
-TEST(NetworkChangeManagerClientTest,
-     NetworkChangeNotifierConnectionTypeUpdated) {
-  // Create a NetworkChangeNotifier with a non-NONE connection type.
-  content::TestBrowserThreadBundle thread_bundle_;
-  std::unique_ptr<net::NetworkChangeNotifierPosix> network_change_notifier(
-      static_cast<net::NetworkChangeNotifierPosix*>(
-          net::NetworkChangeNotifier::Create()));
-  network_change_notifier->OnConnectionChanged(
-      net::NetworkChangeNotifier::CONNECTION_UNKNOWN);
-  EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_UNKNOWN,
-            net::NetworkChangeNotifier::GetConnectionType());
-
-  // Initialize DBus and clear services so NetworkHandler thinks we're offline.
-  DBusThreadManager::Initialize();
-  PowerManagerClient::InitializeFake();
-  NetworkHandler::Initialize();
-  DBusThreadManager::Get()
-      ->GetShillServiceClient()
-      ->GetTestInterface()
-      ->ClearServices();
-
-  auto client = std::make_unique<NetworkChangeManagerClient>(
-      network_change_notifier.get());
-
-  // NetworkChangeManagerClient should have read the network state from DBus
-  // and notified NetworkChangeNotifier that we're offline.
-  EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_NONE,
-            client->connection_type_);
-  EXPECT_EQ(net::NetworkChangeNotifier::CONNECTION_NONE,
-            net::NetworkChangeNotifier::GetConnectionType());
-
-  client.reset();
-  NetworkHandler::Shutdown();
-  PowerManagerClient::Shutdown();
-  DBusThreadManager::Shutdown();
-}
-
 class NetworkChangeManagerClientUpdateTest : public testing::Test {
  protected:
   NetworkChangeManagerClientUpdateTest() : default_network_("") {}
diff --git a/chrome/browser/chromeos/policy/device_cloud_policy_browsertest.cc b/chrome/browser/chromeos/policy/device_cloud_policy_browsertest.cc
index b42fbb9..c40429b 100644
--- a/chrome/browser/chromeos/policy/device_cloud_policy_browsertest.cc
+++ b/chrome/browser/chromeos/policy/device_cloud_policy_browsertest.cc
@@ -367,8 +367,8 @@
 
     device_policy()
         ->payload()
-        .mutable_device_login_screen_app_install_list()
-        ->add_device_login_screen_app_install_list(policy_item_value);
+        .mutable_device_login_screen_extensions()
+        ->add_device_login_screen_extensions(policy_item_value);
 
     device_policy()->Build();
     session_manager_client()->set_device_policy(device_policy()->GetBlob());
diff --git a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
index 5e1051f1..265250f 100644
--- a/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
+++ b/chrome/browser/chromeos/policy/device_policy_decoder_chromeos.cc
@@ -324,13 +324,14 @@
                   nullptr);
   }
 
-  if (policy.has_device_login_screen_app_install_list()) {
-    const em::DeviceLoginScreenAppInstallListProto& proto(
-        policy.device_login_screen_app_install_list());
+  if (policy.has_device_login_screen_extensions()) {
+    const em::DeviceLoginScreenExtensionsProto& proto(
+        policy.device_login_screen_extensions());
     std::unique_ptr<base::ListValue> apps(new base::ListValue);
-    for (const auto& app : proto.device_login_screen_app_install_list())
+    for (const auto& app : proto.device_login_screen_extensions()) {
       apps->AppendString(app);
-    policies->Set(key::kDeviceLoginScreenAppInstallList, POLICY_LEVEL_MANDATORY,
+    }
+    policies->Set(key::kDeviceLoginScreenExtensions, POLICY_LEVEL_MANDATORY,
                   POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(apps),
                   nullptr);
   }
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc b/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc
new file mode 100644
index 0000000..270fabd
--- /dev/null
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager.cc
@@ -0,0 +1,94 @@
+// 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/policy/lock_to_single_user_manager.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "chrome/browser/chromeos/settings/cros_settings.h"
+#include "chrome/browser/lifetime/application_lifetime.h"
+#include "chromeos/cryptohome/cryptohome_parameters.h"
+#include "chromeos/dbus/cryptohome/cryptohome_client.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "components/policy/proto/chrome_device_policy.pb.h"
+#include "components/user_manager/user_manager.h"
+
+using RebootOnSignOutPolicy =
+    enterprise_management::DeviceRebootOnUserSignoutProto;
+using RebootOnSignOutRequest =
+    cryptohome::LockToSingleUserMountUntilRebootRequest;
+using RebootOnSignOutReply = cryptohome::LockToSingleUserMountUntilRebootReply;
+using RebootOnSignOutResult =
+    cryptohome::LockToSingleUserMountUntilRebootResult;
+
+namespace policy {
+
+LockToSingleUserManager::LockToSingleUserManager() {
+  CHECK(chromeos::LoginState::IsInitialized());
+  login_state_observer_.Add(chromeos::LoginState::Get());
+}
+
+LockToSingleUserManager::~LockToSingleUserManager() {}
+
+void LockToSingleUserManager::LoggedInStateChanged() {
+  if (!chromeos::LoginState::Get()->IsUserLoggedIn() ||
+      !user_manager::UserManager::Get()->GetPrimaryUser()) {
+    return;
+  }
+  int policy_value = -1;
+  if (!chromeos::CrosSettings::Get()->GetInteger(
+          chromeos::kDeviceRebootOnUserSignout, &policy_value)) {
+    return;
+  }
+  login_state_observer_.RemoveAll();
+  switch (policy_value) {
+    case RebootOnSignOutPolicy::ALWAYS:
+      LockToSingleUser();
+      break;
+    case RebootOnSignOutPolicy::ARC_SESSION:
+      arc_session_observer_.Add(arc::ArcSessionManager::Get());
+      break;
+  }
+}
+
+void LockToSingleUserManager::OnArcStarted() {
+  arc_session_observer_.RemoveAll();
+  LockToSingleUser();
+}
+
+void LockToSingleUserManager::LockToSingleUser() {
+  cryptohome::AccountIdentifier account_id =
+      cryptohome::CreateAccountIdentifierFromAccountId(
+          user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId());
+  RebootOnSignOutRequest request;
+  request.mutable_account_id()->CopyFrom(account_id);
+  chromeos::CryptohomeClient::Get()->LockToSingleUserMountUntilReboot(
+      request,
+      base::BindOnce(
+          &LockToSingleUserManager::OnLockToSingleUserMountUntilRebootDone,
+          weak_factory_.GetWeakPtr()));
+}
+
+void LockToSingleUserManager::OnLockToSingleUserMountUntilRebootDone(
+    base::Optional<cryptohome::BaseReply> reply) {
+  // TODO(igorcov): Add UMA stats and remove multi user sign in option from UI.
+  if (!reply || !reply->HasExtension(RebootOnSignOutReply::reply)) {
+    LOG(ERROR) << "Signing out user: no reply from "
+                  "LockToSingleUserMountUntilReboot D-Bus call.";
+    chrome::AttemptUserExit();
+    return;
+  }
+
+  // Force user logout if failed to lock the device to single user mount.
+  const RebootOnSignOutReply extension =
+      reply->GetExtension(RebootOnSignOutReply::reply);
+  if (extension.result() != RebootOnSignOutResult::SUCCESS &&
+      extension.result() != RebootOnSignOutResult::PCR_ALREADY_EXTENDED) {
+    LOG(ERROR) << "Signing out user: failed to lock device to single user: "
+               << extension.result();
+    chrome::AttemptUserExit();
+  }
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager.h b/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
new file mode 100644
index 0000000..779765e
--- /dev/null
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager.h
@@ -0,0 +1,52 @@
+// 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_POLICY_LOCK_TO_SINGLE_USER_MANAGER_H_
+#define CHROME_BROWSER_CHROMEOS_POLICY_LOCK_TO_SINGLE_USER_MANAGER_H_
+
+#include "base/macros.h"
+#include "base/memory/weak_ptr.h"
+#include "base/optional.h"
+#include "base/scoped_observer.h"
+#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chromeos/dbus/cryptohome/rpc.pb.h"
+#include "chromeos/login/login_state/login_state.h"
+
+namespace policy {
+
+// This class observes the LoginState and ArcSessionManager and checks if the
+// device must be locked to a single user mount, if the policy forces it.
+class LockToSingleUserManager final : public chromeos::LoginState::Observer,
+                                      public arc::ArcSessionManager::Observer {
+ public:
+  LockToSingleUserManager();
+  ~LockToSingleUserManager() override;
+
+  // chromeos::LoginState::Observer overrides
+  void LoggedInStateChanged() override;
+
+  // arc::ArcSessionManager::Observer overrides
+  void OnArcStarted() override;
+
+ private:
+  // Sends D-Bus request to lock device to single user mount.
+  void LockToSingleUser();
+
+  // Processes the response from D-Bus call.
+  void OnLockToSingleUserMountUntilRebootDone(
+      base::Optional<cryptohome::BaseReply> reply);
+
+  ScopedObserver<arc::ArcSessionManager, arc::ArcSessionManager::Observer>
+      arc_session_observer_{this};
+  ScopedObserver<chromeos::LoginState, chromeos::LoginState::Observer>
+      login_state_observer_{this};
+
+  base::WeakPtrFactory<LockToSingleUserManager> weak_factory_{this};
+
+  DISALLOW_COPY_AND_ASSIGN(LockToSingleUserManager);
+};
+
+}  // namespace policy
+
+#endif  // CHROME_BROWSER_CHROMEOS_POLICY_LOCK_TO_SINGLE_USER_MANAGER_H_
diff --git a/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
new file mode 100644
index 0000000..509c0b01
--- /dev/null
+++ b/chrome/browser/chromeos/policy/lock_to_single_user_manager_unittest.cc
@@ -0,0 +1,133 @@
+// 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/policy/lock_to_single_user_manager.h"
+
+#include <memory>
+
+#include "base/macros.h"
+#include "base/memory/ptr_util.h"
+#include "chrome/browser/chromeos/arc/arc_session_manager.h"
+#include "chrome/browser/chromeos/login/users/fake_chrome_user_manager.h"
+#include "chrome/browser/chromeos/settings/device_settings_service.h"
+#include "chrome/browser/chromeos/settings/scoped_testing_cros_settings.h"
+#include "chrome/browser/ui/app_list/arc/arc_app_test.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chromeos/dbus/cryptohome/fake_cryptohome_client.h"
+#include "chromeos/login/login_state/login_state.h"
+#include "chromeos/settings/cros_settings_names.h"
+#include "components/account_id/account_id.h"
+#include "components/arc/arc_service_manager.h"
+#include "components/arc/arc_util.h"
+#include "components/arc/test/fake_arc_session.h"
+#include "components/policy/proto/chrome_device_policy.pb.h"
+#include "components/user_manager/scoped_user_manager.h"
+
+namespace policy {
+
+class LockToSingleUserManagerTest : public BrowserWithTestWindowTest {
+ public:
+  LockToSingleUserManagerTest() = default;
+  ~LockToSingleUserManagerTest() override = default;
+
+  void SetUp() override {
+    arc::SetArcAvailableCommandLineForTesting(
+        base::CommandLine::ForCurrentProcess());
+    chromeos::LoginState::Initialize();
+    chromeos::CryptohomeClient::InitializeFake();
+    lock_to_single_user_manager_ = std::make_unique<LockToSingleUserManager>();
+
+    BrowserWithTestWindowTest::SetUp();
+
+    settings_helper_.ReplaceDeviceSettingsProviderWithStub();
+    arc::ArcSessionManager::SetUiEnabledForTesting(false);
+    arc_service_manager_ = std::make_unique<arc::ArcServiceManager>();
+    arc_session_manager_ = std::make_unique<arc::ArcSessionManager>(
+        std::make_unique<arc::ArcSessionRunner>(
+            base::BindRepeating(arc::FakeArcSession::Create)));
+
+    arc_service_manager_->set_browser_context(profile());
+  }
+
+  void TearDown() override {
+    arc_session_manager_->Shutdown();
+    arc_service_manager_->set_browser_context(nullptr);
+
+    BrowserWithTestWindowTest::TearDown();
+    arc_session_manager_.reset();
+    arc_service_manager_.reset();
+    lock_to_single_user_manager_.reset();
+
+    chromeos::CryptohomeClient::Shutdown();
+    chromeos::LoginState::Shutdown();
+  }
+
+  void LogInUser() {
+    const AccountId account_id(AccountId::FromUserEmailGaiaId(
+        profile()->GetProfileUserName(), "1234567890"));
+    fake_user_manager_->AddUser(account_id);
+    fake_user_manager_->LoginUser(account_id);
+    chromeos::LoginState::Get()->SetLoggedInState(
+        chromeos::LoginState::LOGGED_IN_ACTIVE,
+        chromeos::LoginState::LOGGED_IN_USER_REGULAR);
+
+    arc_session_manager_->SetProfile(profile());
+    arc_session_manager_->Initialize();
+  }
+
+  void SetPolicyValue(int value) {
+    settings_helper_.SetInteger(chromeos::kDeviceRebootOnUserSignout, value);
+  }
+
+  void StartArc() { arc_session_manager_->StartArcForTesting(); }
+
+  bool is_device_locked() const {
+    return chromeos::FakeCryptohomeClient::Get()
+        ->is_device_locked_to_single_user();
+  }
+
+ private:
+  chromeos::ScopedCrosSettingsTestHelper settings_helper_{
+      /* create_settings_service= */ false};
+  chromeos::FakeChromeUserManager* fake_user_manager_{
+      new chromeos::FakeChromeUserManager()};
+  user_manager::ScopedUserManager scoped_user_manager_{
+      base::WrapUnique(fake_user_manager_)};
+  std::unique_ptr<arc::ArcServiceManager> arc_service_manager_;
+  std::unique_ptr<arc::ArcSessionManager> arc_session_manager_;
+  std::unique_ptr<LockToSingleUserManager> lock_to_single_user_manager_;
+
+  DISALLOW_COPY_AND_ASSIGN(LockToSingleUserManagerTest);
+};
+
+TEST_F(LockToSingleUserManagerTest, ArcSessionLockTest) {
+  SetPolicyValue(
+      enterprise_management::DeviceRebootOnUserSignoutProto::ARC_SESSION);
+  LogInUser();
+  EXPECT_FALSE(is_device_locked());
+  StartArc();
+  EXPECT_TRUE(is_device_locked());
+}
+
+TEST_F(LockToSingleUserManagerTest, AlwaysLockTest) {
+  SetPolicyValue(enterprise_management::DeviceRebootOnUserSignoutProto::ALWAYS);
+  LogInUser();
+  EXPECT_TRUE(is_device_locked());
+}
+
+TEST_F(LockToSingleUserManagerTest, NeverLockTest) {
+  SetPolicyValue(enterprise_management::DeviceRebootOnUserSignoutProto::NEVER);
+  LogInUser();
+  EXPECT_FALSE(is_device_locked());
+}
+
+TEST_F(LockToSingleUserManagerTest, DbusCallErrorTest) {
+  chromeos::FakeCryptohomeClient::Get()->set_cryptohome_error(
+      cryptohome::CRYPTOHOME_ERROR_KEY_NOT_FOUND);
+  SetPolicyValue(enterprise_management::DeviceRebootOnUserSignoutProto::ALWAYS);
+  LogInUser();
+  EXPECT_FALSE(is_device_locked());
+}
+
+}  // namespace policy
diff --git a/chrome/browser/chromeos/policy/signin_profile_apps_policy_browsertest.cc b/chrome/browser/chromeos/policy/signin_profile_apps_policy_browsertest.cc
index d0172dca..248832a 100644
--- a/chrome/browser/chromeos/policy/signin_profile_apps_policy_browsertest.cc
+++ b/chrome/browser/chromeos/policy/signin_profile_apps_policy_browsertest.cc
@@ -191,8 +191,8 @@
         "$1;$2", {extension_id, update_manifest_url.spec()}, nullptr);
     device_policy()
         ->payload()
-        .mutable_device_login_screen_app_install_list()
-        ->add_device_login_screen_app_install_list(policy_item_value);
+        .mutable_device_login_screen_extensions()
+        ->add_device_login_screen_extensions(policy_item_value);
     RefreshDevicePolicy();
   }
 
diff --git a/chrome/browser/chromeos/power/idle_action_warning_observer.cc b/chrome/browser/chromeos/power/idle_action_warning_observer.cc
index 42696bea..70e5005 100644
--- a/chrome/browser/chromeos/power/idle_action_warning_observer.cc
+++ b/chrome/browser/chromeos/power/idle_action_warning_observer.cc
@@ -4,11 +4,15 @@
 
 #include "chrome/browser/chromeos/power/idle_action_warning_observer.h"
 
+#include "ash/public/cpp/ash_pref_names.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/time/time.h"
 #include "chrome/browser/chromeos/login/demo_mode/demo_session.h"
 #include "chrome/browser/chromeos/power/idle_action_warning_dialog_view.h"
+#include "chrome/browser/profiles/profile_manager.h"
 #include "chromeos/dbus/dbus_thread_manager.h"
+#include "chromeos/dbus/power/power_policy_controller.h"
+#include "components/prefs/pref_service.h"
 
 namespace {
 
@@ -24,6 +28,16 @@
     UMA_HISTOGRAM_ENUMERATION("DemoMode.IdleLogoutWarningEvent", event);
 }
 
+chromeos::PowerPolicyController::Action GetIdleAction(bool on_battery_power) {
+  PrefService* prefs = ProfileManager::GetActiveUserProfile()->GetPrefs();
+  int action;
+  if (on_battery_power)
+    action = prefs->GetInteger(ash::prefs::kPowerBatteryIdleAction);
+  else
+    action = prefs->GetInteger(ash::prefs::kPowerAcIdleAction);
+  return static_cast<chromeos::PowerPolicyController::Action>(action);
+}
+
 }  // namespace
 
 namespace chromeos {
@@ -40,6 +54,14 @@
 
 void IdleActionWarningObserver::IdleActionImminent(
     const base::TimeDelta& time_until_idle_action) {
+  // Only display warning if idle action is to shut down or logout.
+  PowerPolicyController::Action idle_action = GetIdleAction(on_battery_power_);
+  if (idle_action != PowerPolicyController::ACTION_STOP_SESSION &&
+      idle_action != PowerPolicyController::ACTION_SHUT_DOWN) {
+    HideDialogIfPresent();
+    return;
+  }
+
   const base::TimeTicks idle_action_time =
       base::TimeTicks::Now() + time_until_idle_action;
   if (warning_dialog_) {
@@ -51,11 +73,22 @@
 }
 
 void IdleActionWarningObserver::IdleActionDeferred() {
+  HideDialogIfPresent();
+}
+
+void IdleActionWarningObserver::PowerChanged(
+    const power_manager::PowerSupplyProperties& proto) {
+  on_battery_power_ =
+      proto.battery_state() ==
+      power_manager::PowerSupplyProperties_BatteryState_DISCHARGING;
+}
+
+void IdleActionWarningObserver::HideDialogIfPresent() {
   if (warning_dialog_) {
     warning_dialog_->CloseDialog();
     ReportMetricsForDemoMode(IdleLogoutWarningEvent::kCanceled);
   }
-  warning_dialog_ = NULL;
+  warning_dialog_ = nullptr;
 }
 
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/power/idle_action_warning_observer.h b/chrome/browser/chromeos/power/idle_action_warning_observer.h
index 3ee69931..47b46619 100644
--- a/chrome/browser/chromeos/power/idle_action_warning_observer.h
+++ b/chrome/browser/chromeos/power/idle_action_warning_observer.h
@@ -24,10 +24,16 @@
   void IdleActionImminent(
       const base::TimeDelta& time_until_idle_action) override;
   void IdleActionDeferred() override;
+  void PowerChanged(const power_manager::PowerSupplyProperties& proto) override;
 
  private:
+  void HideDialogIfPresent();
+
   IdleActionWarningDialogView* warning_dialog_;  // Not owned.
 
+  // Used to derive the correct idle action (IdleActionAC/IdleActionBattery).
+  bool on_battery_power_ = false;
+
   DISALLOW_COPY_AND_ASSIGN(IdleActionWarningObserver);
 };
 
diff --git a/chrome/browser/chromeos/settings/device_settings_provider.cc b/chrome/browser/chromeos/settings/device_settings_provider.cc
index 2324beb..073f426 100644
--- a/chrome/browser/chromeos/settings/device_settings_provider.cc
+++ b/chrome/browser/chromeos/settings/device_settings_provider.cc
@@ -75,7 +75,7 @@
     kDeviceDisabledMessage,
     kDeviceDisplayResolution,
     kDeviceHostnameTemplate,
-    kDeviceLoginScreenAppInstallList,
+    kDeviceLoginScreenExtensions,
     kDeviceLoginScreenInputMethods,
     kDeviceLoginScreenLocales,
     kDeviceOffHours,
@@ -352,13 +352,14 @@
                                base::Value(std::move(list)));
   }
 
-  if (policy.has_device_login_screen_app_install_list()) {
+  if (policy.has_device_login_screen_extensions()) {
     std::vector<base::Value> apps;
-    const em::DeviceLoginScreenAppInstallListProto& proto(
-        policy.device_login_screen_app_install_list());
-    for (const auto& app : proto.device_login_screen_app_install_list())
+    const em::DeviceLoginScreenExtensionsProto& proto(
+        policy.device_login_screen_extensions());
+    for (const auto& app : proto.device_login_screen_extensions()) {
       apps.push_back(base::Value(app));
-    new_values_cache->SetValue(kDeviceLoginScreenAppInstallList,
+    }
+    new_values_cache->SetValue(kDeviceLoginScreenExtensions,
                                base::Value(std::move(apps)));
   }
 
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index 78119d4..e26c3be6 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -1563,17 +1563,6 @@
   web_socket.reset();
 }
 
-// Tests that a clean close from the server is not reported as an error when
-// there is a race between OnDropChannel and SendFrame.
-// Regression test for https://crbug.com/937790.
-IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, WebSocketCleanClose) {
-  ASSERT_TRUE(StartEmbeddedTestServer());
-  ASSERT_TRUE(StartWebSocketServer(net::GetWebSocketTestDataDirectory()));
-  ASSERT_TRUE(
-      RunExtensionSubtest("webrequest", "test_websocket_clean_close.html"))
-      << message_;
-}
-
 // Test behavior when intercepting requests from a browser-initiated url fetch.
 IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest,
                        WebRequestURLLoaderInterception) {
diff --git a/chrome/browser/extensions/extension_management.cc b/chrome/browser/extensions/extension_management.cc
index 3191331f..a51e03c7 100644
--- a/chrome/browser/extensions/extension_management.cc
+++ b/chrome/browser/extensions/extension_management.cc
@@ -61,7 +61,7 @@
                              pref_change_callback);
   pref_change_registrar_.Add(pref_names::kInstallForceList,
                              pref_change_callback);
-  pref_change_registrar_.Add(pref_names::kInstallLoginScreenAppList,
+  pref_change_registrar_.Add(pref_names::kLoginScreenExtensions,
                              pref_change_callback);
   pref_change_registrar_.Add(pref_names::kAllowedInstallSites,
                              pref_change_callback);
@@ -323,10 +323,10 @@
   const base::DictionaryValue* forced_list_pref =
       static_cast<const base::DictionaryValue*>(LoadPreference(
           pref_names::kInstallForceList, true, base::Value::Type::DICTIONARY));
-  const base::DictionaryValue* login_screen_app_list_pref = nullptr;
+  const base::DictionaryValue* login_screen_extensions_pref = nullptr;
   if (is_signin_profile_) {
-    login_screen_app_list_pref = static_cast<const base::DictionaryValue*>(
-        LoadPreference(pref_names::kInstallLoginScreenAppList, true,
+    login_screen_extensions_pref = static_cast<const base::DictionaryValue*>(
+        LoadPreference(pref_names::kLoginScreenExtensions, true,
                        base::Value::Type::DICTIONARY));
   }
   const base::ListValue* install_sources_pref =
@@ -390,7 +390,7 @@
   }
 
   UpdateForcedExtensions(forced_list_pref);
-  UpdateForcedExtensions(login_screen_app_list_pref);
+  UpdateForcedExtensions(login_screen_extensions_pref);
 
   if (install_sources_pref) {
     global_settings_->has_restricted_install_sources = true;
diff --git a/chrome/browser/extensions/policy_handlers.cc b/chrome/browser/extensions/policy_handlers.cc
index 0974548..9790299 100644
--- a/chrome/browser/extensions/policy_handlers.cc
+++ b/chrome/browser/extensions/policy_handlers.cc
@@ -150,13 +150,13 @@
     : ExtensionInstallListPolicyHandler(policy::key::kExtensionInstallForcelist,
                                         pref_names::kInstallForceList) {}
 
-// ExtensionInstallLoginScreenAppListPolicyHandler implementation --------------
+// ExtensionInstallLoginScreenExtensionsPolicyHandler implementation -----------
 
-ExtensionInstallLoginScreenAppListPolicyHandler::
-    ExtensionInstallLoginScreenAppListPolicyHandler()
+ExtensionInstallLoginScreenExtensionsPolicyHandler::
+    ExtensionInstallLoginScreenExtensionsPolicyHandler()
     : ExtensionInstallListPolicyHandler(
-          policy::key::kDeviceLoginScreenAppInstallList,
-          pref_names::kInstallLoginScreenAppList) {}
+          policy::key::kDeviceLoginScreenExtensions,
+          pref_names::kLoginScreenExtensions) {}
 
 // ExtensionURLPatternListPolicyHandler implementation -------------------------
 
diff --git a/chrome/browser/extensions/policy_handlers.h b/chrome/browser/extensions/policy_handlers.h
index 77f86cd..db0e0e2 100644
--- a/chrome/browser/extensions/policy_handlers.h
+++ b/chrome/browser/extensions/policy_handlers.h
@@ -83,14 +83,14 @@
 };
 
 // Parses the extension force install list for the login profile.
-class ExtensionInstallLoginScreenAppListPolicyHandler
+class ExtensionInstallLoginScreenExtensionsPolicyHandler
     : public ExtensionInstallListPolicyHandler {
  public:
-  ExtensionInstallLoginScreenAppListPolicyHandler();
-  ~ExtensionInstallLoginScreenAppListPolicyHandler() override = default;
+  ExtensionInstallLoginScreenExtensionsPolicyHandler();
+  ~ExtensionInstallLoginScreenExtensionsPolicyHandler() override = default;
 
  private:
-  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallLoginScreenAppListPolicyHandler);
+  DISALLOW_COPY_AND_ASSIGN(ExtensionInstallLoginScreenExtensionsPolicyHandler);
 };
 
 // Implements additional checks for policies that are lists of extension
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 1fcdaa8..ac135e5 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2181,6 +2181,11 @@
     "expiry_milestone": 76
   },
   {
+    "name": "in-session-password-change",
+    // "owners": [ "rsorokin" ],
+    "expiry_milestone": 77
+  },
+  {
     "name": "incognito-strings",
     // "owners": [ "your-team" ],
     "expiry_milestone": 76
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc
index 518c3ae..09e6a5a0 100644
--- a/chrome/browser/flag_descriptions.cc
+++ b/chrome/browser/flag_descriptions.cc
@@ -86,11 +86,6 @@
 const char kDrawVerticallyEdgeToEdgeDescription[] =
     "Draw contents vertically from edge to edge.";
 
-const char kEnableBlinkHeapUnifiedGarbageCollectionName[] =
-    "Blink Heap Unified Garbage Collection";
-const char kEnableBlinkHeapUnifiedGarbageCollectionDescription[] =
-    "Enable unified garbage collection in Blink";
-
 const char kEnableBloatedRendererDetectionName[] = "Bloated renderer detection";
 const char kEnableBloatedRendererDetectionDescription[] =
     "Enable bloated renderer detection";
@@ -2048,13 +2043,6 @@
 const char kWebMidiName[] = "Web MIDI API";
 const char kWebMidiDescription[] = "Enable Web MIDI API experimental support.";
 
-const char kWebrtcH264WithOpenh264FfmpegName[] =
-    "WebRTC H.264 software video encoder/decoder";
-const char kWebrtcH264WithOpenh264FfmpegDescription[] =
-    "When enabled, an H.264 software video encoder/decoder pair is included. "
-    "If a hardware encoder/decoder is also available it may be used instead of "
-    "this encoder/decoder.";
-
 const char kWebrtcHideLocalIpsWithMdnsName[] =
     "Anonymize local IPs exposed by WebRTC.";
 const char kWebrtcHideLocalIpsWithMdnsDecription[] =
@@ -3431,6 +3419,13 @@
     "Enables the redesigned notification stacking bar UI with a \"Clear all\" "
     "button.";
 
+extern const char kInSessionPasswordChangeName[] =
+    "Enable user password change in the session";
+
+extern const char kInSessionPasswordChangeDescription[] =
+    "Let user change both their IdP password and Chromebook password on "
+    "chrome://password-change page.";
+
 #endif  // defined(OS_CHROMEOS)
 
 // All views-based platforms --------------------------------------------------
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index a7be4ca09..bf81bec 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -75,9 +75,6 @@
 extern const char kAutomaticPasswordGenerationName[];
 extern const char kAutomaticPasswordGenerationDescription[];
 
-extern const char kEnableBlinkHeapUnifiedGarbageCollectionName[];
-extern const char kEnableBlinkHeapUnifiedGarbageCollectionDescription[];
-
 extern const char kEnableBloatedRendererDetectionName[];
 extern const char kEnableBloatedRendererDetectionDescription[];
 
@@ -1227,9 +1224,6 @@
 extern const char kWebMidiName[];
 extern const char kWebMidiDescription[];
 
-extern const char kWebrtcH264WithOpenh264FfmpegName[];
-extern const char kWebrtcH264WithOpenh264FfmpegDescription[];
-
 extern const char kWebrtcHideLocalIpsWithMdnsName[];
 extern const char kWebrtcHideLocalIpsWithMdnsDecription[];
 
@@ -2070,6 +2064,9 @@
 extern const char kAshNotificationStackingBarRedesignName[];
 extern const char kAshNotificationStackingBarRedesignDescription[];
 
+extern const char kInSessionPasswordChangeName[];
+extern const char kInSessionPasswordChangeDescription[];
+
 #endif  // #if defined(OS_CHROMEOS)
 
 // All views-based platforms --------------------------------------------------
diff --git a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc
index a39c93f..e6fcb2f 100644
--- a/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc
+++ b/chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc
@@ -140,8 +140,11 @@
 void PageLoadMetricsObserverTestHarness::NavigateWithPageTransitionAndCommit(
     const GURL& url,
     ui::PageTransition transition) {
-  auto simulator =
-      content::NavigationSimulator::CreateRendererInitiated(url, main_rfh());
+  auto simulator = PageTransitionIsWebTriggerable(transition)
+                       ? content::NavigationSimulator::CreateRendererInitiated(
+                             url, main_rfh())
+                       : content::NavigationSimulator::CreateBrowserInitiated(
+                             url, web_contents());
   simulator->SetTransition(transition);
   simulator->Commit();
 }
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc
index 40f339f..f1392f5f 100644
--- a/chrome/browser/password_manager/password_manager_browsertest.cc
+++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -966,8 +966,15 @@
   EXPECT_FALSE(prompt_observer->IsSavePromptShownAutomatically());
 }
 
+// Disabled due to flakiness on windows.
+#if defined(OS_WIN)
+#define MAYBE_VerifyPasswordGenerationUpload \
+  DISABLED_VerifyPasswordGenerationUpload
+#else
+#define MAYBE_VerifyPasswordGenerationUpload VerifyPasswordGenerationUpload
+#endif
 IN_PROC_BROWSER_TEST_F(PasswordManagerBrowserTest,
-                       VerifyPasswordGenerationUpload) {
+                       MAYBE_VerifyPasswordGenerationUpload) {
   // Prevent Autofill requests from actually going over the wire.
   net::TestURLFetcherFactory factory;
   // Disable Autofill requesting access to AddressBook data. This causes
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 7990fd9..75917ffe 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1160,7 +1160,7 @@
       std::make_unique<extensions::ExtensionInstallForcelistPolicyHandler>());
   handlers->AddHandler(
       std::make_unique<
-          extensions::ExtensionInstallLoginScreenAppListPolicyHandler>());
+          extensions::ExtensionInstallLoginScreenExtensionsPolicyHandler>());
   handlers->AddHandler(
       std::make_unique<extensions::ExtensionURLPatternListPolicyHandler>(
           key::kExtensionInstallSources,
diff --git a/chrome/browser/policy/homepage_location_policy_handler.cc b/chrome/browser/policy/homepage_location_policy_handler.cc
index ff7c9fd..cf0b1ca 100644
--- a/chrome/browser/policy/homepage_location_policy_handler.cc
+++ b/chrome/browser/policy/homepage_location_policy_handler.cc
@@ -13,10 +13,20 @@
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_value_map.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/url_formatter/url_fixer.h"
 #include "url/gurl.h"
 
 namespace policy {
 
+namespace {
+
+// Calls url_formatter::FixupURL.
+GURL FixUrl(const std::string& url_spec) {
+  return url_formatter::FixupURL(url_spec, std::string());
+}
+
+}  // namespace
+
 HomepageLocationPolicyHandler::HomepageLocationPolicyHandler()
     : TypeCheckingPolicyHandler(key::kHomepageLocation,
                                 base::Value::Type::STRING) {}
@@ -32,8 +42,9 @@
   if (!value)
     return true;
 
-  // Check whether the URL is a standard scheme to prevent e.g. Javascript.
-  GURL homepage_url(value->GetString());
+  // Check whether the URL is a standard scheme to prevent e.g. Javascript,
+  // doing a best effort fixing invalid URLs like "example.com".
+  GURL homepage_url = FixUrl(value->GetString());
   if (!homepage_url.is_valid() || !homepage_url.IsStandard()) {
     errors->AddError(policy_name(), IDS_POLICY_HOMEPAGE_LOCATION_ERROR);
     return false;
@@ -46,8 +57,10 @@
     const PolicyMap& policies,
     PrefValueMap* prefs) {
   const base::Value* policy_value = nullptr;
-  if (CheckAndGetValue(policies, nullptr, &policy_value) && policy_value)
-    prefs->SetString(prefs::kHomePage, policy_value->GetString());
+  if (CheckAndGetValue(policies, nullptr, &policy_value) && policy_value) {
+    prefs->SetString(prefs::kHomePage,
+                     FixUrl(policy_value->GetString()).spec());
+  }
 }
 
 }  // namespace policy
diff --git a/chrome/browser/policy/homepage_location_policy_handler_unittest.cc b/chrome/browser/policy/homepage_location_policy_handler_unittest.cc
index c34a429..dfda726 100644
--- a/chrome/browser/policy/homepage_location_policy_handler_unittest.cc
+++ b/chrome/browser/policy/homepage_location_policy_handler_unittest.cc
@@ -19,11 +19,12 @@
 
 namespace {
 
-constexpr char kHttpUrl[] = "http://example.com";
-constexpr char kHttpsUrl[] = "https://example.com";
+constexpr char kHttpUrl[] = "http://example.com/";
+constexpr char kHttpsUrl[] = "https://example.com/";
 constexpr char kFileUrl[] = "file:///wohnzimmertapete.html";
+constexpr char kUrlWithNoScheme[] = "example.com";
+constexpr char kFixedUrlWithNoScheme[] = "http://example.com/";
 constexpr char kInvalidSchemeUrl[] = "xss://crazy_hack.js";
-constexpr char kInvalidUrl[] = "example.com";
 constexpr char kJavascript[] =
     "(function()%7Bvar%20script%20%3D%20document.createElement(%22script%22)%"
     "3Bscript.type%3D%22text%2Fjavascript%22%3Bscript.src%3D%22https%3A%2F%"
@@ -64,9 +65,15 @@
   EXPECT_EQ(0U, errors_.size());
 }
 
-TEST_F(HomepageLocationPolicyHandlerTest, InvalidUrlIsRejected) {
-  EXPECT_FALSE(CheckPolicy(std::make_unique<base::Value>(kInvalidUrl)));
-  EXPECT_EQ(1U, errors_.size());
+TEST_F(HomepageLocationPolicyHandlerTest, kUrlWithMissingSchemeIsFixed) {
+  EXPECT_TRUE(CheckPolicy(std::make_unique<base::Value>(kUrlWithNoScheme)));
+  EXPECT_EQ(0U, errors_.size());
+
+  ApplyPolicies();
+  base::Value* value;
+  EXPECT_TRUE(prefs_.GetValue(prefs::kHomePage, &value));
+  ASSERT_TRUE(value->is_string());
+  EXPECT_EQ(value->GetString(), kFixedUrlWithNoScheme);
 }
 
 TEST_F(HomepageLocationPolicyHandlerTest, InvalidSchemeIsRejected) {
diff --git a/chrome/browser/policy/policy_network_browsertest.cc b/chrome/browser/policy/policy_network_browsertest.cc
index 2afe52b..1a869a64 100644
--- a/chrome/browser/policy/policy_network_browsertest.cc
+++ b/chrome/browser/policy/policy_network_browsertest.cc
@@ -10,6 +10,7 @@
 #include "base/run_loop.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/threading/thread_restrictions.h"
+#include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/net/system_network_context_manager.h"
 #include "chrome/browser/policy/profile_policy_connector_factory.h"
@@ -502,8 +503,17 @@
 // A second Profile is created when no QuicAllowed policy is in effect for the
 // first profile.
 // Then QuicAllowed=false policy is dynamically set for both profiles.
+//
+// Disabled due to flakiness on windows: https://crbug.com/947931.
+#if defined(OS_WIN)
+#define MAYBE_QuicAllowedFalseAfterTwoProfilesCreated \
+  DISABLED_QuicAllowedFalseAfterTwoProfilesCreated
+#else
+#define MAYBE_QuicAllowedFalseAfterTwoProfilesCreated \
+  QuicAllowedFalseAfterTwoProfilesCreated
+#endif
 IN_PROC_BROWSER_TEST_F(QuicAllowedPolicyDynamicTest,
-                       QuicAllowedFalseAfterTwoProfilesCreated) {
+                       MAYBE_QuicAllowedFalseAfterTwoProfilesCreated) {
   // If multiprofile mode is not enabled, you can't switch between profiles.
   if (!profiles::IsMultipleProfilesEnabled())
     return;
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index 2c474d7..d6143f9e 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -69,7 +69,6 @@
 #include "chrome/browser/sessions/tab_restore_service_factory.h"
 #include "chrome/browser/signin/about_signin_internals_factory.h"
 #include "chrome/browser/signin/account_consistency_mode_manager_factory.h"
-#include "chrome/browser/signin/account_fetcher_service_factory.h"
 #include "chrome/browser/signin/account_investigator_factory.h"
 #include "chrome/browser/signin/account_reconcilor_factory.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
@@ -225,7 +224,6 @@
 #endif
   AboutSigninInternalsFactory::GetInstance();
   AccountConsistencyModeManagerFactory::GetInstance();
-  AccountFetcherServiceFactory::GetInstance();
   AccountInvestigatorFactory::GetInstance();
   AccountReconcilorFactory::GetInstance();
   AutocompleteClassifierFactory::GetInstance();
diff --git a/chrome/browser/profiles/profile_downloader.cc b/chrome/browser/profiles/profile_downloader.cc
index b400d9e..30b13eaa 100644
--- a/chrome/browser/profiles/profile_downloader.cc
+++ b/chrome/browser/profiles/profile_downloader.cc
@@ -21,7 +21,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_downloader_delegate.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/signin/account_fetcher_service_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "components/data_use_measurement/core/data_use_user_data.h"
 #include "components/signin/core/browser/account_fetcher_service.h"
diff --git a/chrome/browser/resources/chromeos/camera/Makefile b/chrome/browser/resources/chromeos/camera/Makefile
index a2e34cee..af13b79 100644
--- a/chrome/browser/resources/chromeos/camera/Makefile
+++ b/chrome/browser/resources/chromeos/camera/Makefile
@@ -117,6 +117,7 @@
 	src/js/models/gallery.js \
 	src/js/models/filenamer.js \
 	src/js/models/filesystem.js \
+	src/js/mojo/imagecapture.js \
 	src/js/nav.js \
 	src/js/scrollbar.js \
 	src/js/sound.js \
diff --git a/chrome/browser/resources/chromeos/camera/src/_locales/en/messages.json b/chrome/browser/resources/chromeos/camera/src/_locales/en/messages.json
index a0721b4..d0e8d21 100644
--- a/chrome/browser/resources/chromeos/camera/src/_locales/en/messages.json
+++ b/chrome/browser/resources/chromeos/camera/src/_locales/en/messages.json
@@ -33,6 +33,10 @@
     "message": "Unable to take photo",
     "description": "Error message shown when failing to take photo."
   },
+  "ERROR_MSG_TAKE_PORTRAIT_PHOTO_FAILED": {
+    "message": "Unable to take portrait photo",
+    "description": "Error message shown when failing to take portrait photo."
+  },
   "ERROR_MSG_RECORD_START_FAILED": {
     "message": "Unable to start recording",
     "description": "Error message shown when failing to start recording video."
@@ -149,16 +153,36 @@
   },
   "SWITCH_RECORD_VIDEO_BUTTON": {
     "message": "Switch to record video",
+    "description": "Label for spoken feedback to read out switch to record video mode button."
+  },
+  "LABEL_SWITCH_RECORD_VIDEO_BUTTON": {
+    "message": "Video",
     "description": "Label for the button to switch to record video mode."
   },
   "SWITCH_TAKE_PHOTO_BUTTON": {
     "message": "Switch to take photo",
+    "description": "Label for spoken feedback to read out switch to take photo mode button."
+  },
+  "LABEL_SWITCH_TAKE_PHOTO_BUTTON": {
+    "message": "Photo",
     "description": "Label for the button to switch to take photo mode."
   },
   "SWITCH_TAKE_SQUARE_PHOTO_BUTTON": {
     "message": "Switch to take square photo",
+    "description": "Label for spoken feedback to read out switch to take square photo mode button."
+  },
+  "LABEL_SWITCH_TAKE_SQUARE_PHOTO_BUTTON": {
+    "message": "Square",
     "description": "Label for the button to switch to take square photo mode."
   },
+  "SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON": {
+    "message": "Switch to take portrait photo",
+    "description": "Label for spoken feedback to read out switch to take portrait photo mode button."
+  },
+  "LABEL_SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON": {
+    "message": "Portrait",
+    "description": "Label for the button to switch to take portrait photo mode."
+  },
   "TOGGLE_TIMER_BUTTON": {
     "message": "Timer",
     "description": "Label for the checkbox to toggle the countdown timer."
diff --git a/chrome/browser/resources/chromeos/camera/src/js/metrics.js b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
index 8f6208a..107e6c8 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/metrics.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/metrics.js
@@ -107,7 +107,8 @@
   };
 
   return cca.metrics.base_.category('capture')
-      .action(/^(\w*)/.exec(condState(['video-mode', 'photo-mode']))[0])
+      .action(/^(\w*)/.exec(condState(
+          ['video-mode', 'photo-mode', 'square-mode', 'portrait-mode']))[0])
       .label(facingMode)
       .dimen(3, condState(['sound']))
       .dimen(4, condState(['mirror']))
diff --git a/chrome/browser/resources/chromeos/camera/src/js/models/filenamer.js b/chrome/browser/resources/chromeos/camera/src/js/models/filenamer.js
index 59f40b5..2a740f87 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/models/filenamer.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/models/filenamer.js
@@ -27,6 +27,13 @@
    */
   this.timestamp_ = timestamp === undefined ? Date.now() : timestamp;
 
+  /**
+   * Number of already saved burst images.
+   * @type {number}
+   * @private
+   */
+  this.burstCount_ = 0;
+
   // End of properties, seal the object.
   Object.seal(this);
 };
@@ -46,6 +53,36 @@
 cca.models.Filenamer.VIDEO_PREFIX = 'VID_';
 
 /**
+ * The suffix of burst image files.
+ * @type {string}
+ * @const
+ */
+cca.models.Filenamer.BURST_SUFFIX = '_BURST';
+
+/**
+ * The suffix of cover image for a series of burst image files.
+ * @type {string}
+ * @const
+ */
+cca.models.Filenamer.BURST_COVER_SUFFIX = '_COVER';
+
+/**
+ * Creates new filename for burst image.
+ * @param {boolean} isCover If the image is set as cover of the burst.
+ * @return {string} New filename.
+ */
+cca.models.Filenamer.prototype.newBurstName = function(isCover) {
+  const prependZeros = (n, width) => {
+    n = n + '';
+    return new Array(Math.max(0, width - n.length) + 1).join('0') + n;
+  };
+  return cca.models.Filenamer.IMAGE_PREFIX +
+      cca.models.Filenamer.timestampToDatetimeName_(this.timestamp_) +
+      cca.models.Filenamer.BURST_SUFFIX + prependZeros(++this.burstCount_, 5) +
+      (isCover ? cca.models.Filenamer.BURST_COVER_SUFFIX : '') + '.jpg';
+};
+
+/**
  * Creates new filename for video.
  * @return {string} New filename.
  */
diff --git a/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js b/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
index 9f588ee..5ea93251 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/mojo/imagecapture.js
@@ -25,14 +25,13 @@
  * Creates the wrapper of JS image-capture and Mojo image-capture.
  * @param {MediaStreamTrack} videoTrack A video track whose still images will be
  *     taken.
- * @param {string} deviceId The id of target media device.
  * @constructor
  */
-cca.mojo.ImageCapture = function(videoTrack, deviceId) {
+cca.mojo.ImageCapture = function(videoTrack) {
   /**
    * @type {string} The id of target media device.
    */
-  this.deviceId_ = deviceId;
+  this.deviceId_ = cca.mojo.ImageCapture.resolveDeviceId(videoTrack);
 
   /**
    * @type {ImageCapture}
@@ -51,6 +50,17 @@
 };
 
 /**
+ * Resolves video device id from its video track.
+ * @param {MediaStreamTrack} videoTrack Video track of device to be resolved.
+ * @return {?string} Resolved video device id. Returns null for unable to
+ *     resolve.
+ */
+cca.mojo.ImageCapture.resolveDeviceId = function(videoTrack) {
+  const trackSettings = videoTrack.getSettings && videoTrack.getSettings();
+  return trackSettings && trackSettings.deviceId || null;
+};
+
+/**
  * Gets the photo capabilities with the available options/effects.
  * @return {Promise<cca.mojo.PhotoCapabilities>} Promise for the result.
  */
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
index 7c8ba56d..076ad3d 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera.js
@@ -195,46 +195,6 @@
 };
 
 /**
- * Returns constraints-candidates for all available video-devices.
- * @return {!Promise<Array<Object>>} Promise for the result.
- * @private
- */
-cca.views.Camera.prototype.constraintsCandidates_ = function() {
-  var deviceConstraints = (deviceId, videoMode) => {
-    // Constraints are ordered by priority.
-    return [
-      {
-        aspectRatio: {ideal: videoMode ? 1.7777777778 : 1.3333333333},
-        width: {min: 1280},
-        frameRate: {min: 24},
-      },
-      {
-        width: {min: 640},
-        frameRate: {min: 24},
-      },
-    ].map((constraint) => {
-      // Each passed-in video-constraint will be modified here.
-      if (deviceId) {
-        constraint.deviceId = {exact: deviceId};
-      } else {
-        // As a default camera use the one which is facing the user.
-        constraint.facingMode = {exact: 'user'};
-      }
-      return {audio: videoMode, video: constraint};
-    });
-  };
-
-  return this.options_.videoDeviceIds().then((deviceIds) => {
-    var videoMode = cca.state.get('video-mode');
-    var candidates = [];
-    deviceIds.forEach((deviceId) => {
-      candidates = candidates.concat(deviceConstraints(deviceId, videoMode));
-    });
-    return candidates;
-  });
-};
-
-/**
  * Stops camera and tries to start camera stream again if possible.
  * @return {!Promise} Promise for the start-camera operation.
  * @private
@@ -260,45 +220,38 @@
 cca.views.Camera.prototype.start_ = function() {
   var suspend = this.locked_ || chrome.app.window.current().isMinimized();
   this.started_ =
-      (suspend ? Promise.reject(new Error('suspend')) :
-                 this.constraintsCandidates_())
-          .then((candidates) => {
-            var tryStartWithCandidate = (index) => {
-              if (index >= candidates.length) {
-                return Promise.reject(new Error('out-of-candidates'));
+      (async () => {
+        if (!suspend) {
+          for (const id of await this.options_.videoDeviceIds()) {
+            for (const [mode, constraints] of await this.modes_
+                     .getConstraitsForModes(id)) {
+              try {
+                const stream =
+                    await navigator.mediaDevices.getUserMedia(constraints);
+                await this.preview_.start(stream);
+                this.facingMode_ =
+                    this.options_.updateValues(constraints, stream);
+                await this.modes_.updateMode(mode, stream);
+                cca.nav.close('warning', 'no-camera');
+                return;
+              } catch (e) {
+                this.preview_.stop();
+                console.error(e);
               }
-              var constraints = candidates[index];
-              return navigator.mediaDevices.getUserMedia(constraints)
-                  .then(this.preview_.start.bind(this.preview_))
-                  .then(() => {
-                    this.facingMode_ = this.options_.updateValues(
-                        constraints, this.preview_.stream);
-                    return this.modes_.update(this.preview_.stream);
-                  })
-                  .then(() => {
-                    cca.nav.close('warning', 'no-camera');
-                  })
-                  .catch((error) => {
-                    console.error(error);
-                    return new Promise((resolve) => {
-                      // TODO(mtomasz): Workaround for crbug.com/383241.
-                      setTimeout(
-                          () => resolve(tryStartWithCandidate(index + 1)), 0);
-                    });
-                  });
-            };
-            return tryStartWithCandidate(0);
-          })
-          .catch((error) => {
-            if (error && error.message != 'suspend') {
-              console.error(error);
-              cca.nav.open('warning', 'no-camera');
             }
-            // Schedule to retry.
-            if (this.retryStartTimeout_) {
-              clearTimeout(this.retryStartTimeout_);
-              this.retryStartTimeout_ = null;
-            }
-            this.retryStartTimeout_ = setTimeout(this.start_.bind(this), 100);
-          });
+          }
+        }
+        throw new Error('suspend');
+      })().catch((error) => {
+        if (error && error.message != 'suspend') {
+          console.error(error);
+          cca.nav.open('warning', 'no-camera');
+        }
+        // Schedule to retry.
+        if (this.retryStartTimeout_) {
+          clearTimeout(this.retryStartTimeout_);
+          this.retryStartTimeout_ = null;
+        }
+        this.retryStartTimeout_ = setTimeout(this.start_.bind(this), 100);
+      });
 };
diff --git a/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js b/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js
index a7ca8b26..21d2e08 100644
--- a/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js
+++ b/chrome/browser/resources/chromeos/camera/src/js/views/camera/modes.js
@@ -54,15 +54,56 @@
   this.stream_ = null;
 
   /**
-   * Classname and factory function of available modes.
-   * @type {Object<string, function(): cca.views.camera.Mode>}
+   * Mode classname and related functions and attributes.
+   * @type {Object<string, Object>}
    * @private
    */
-  this.modeFactories_ = {
-    'photo-mode': () =>
-        new cca.views.camera.Photo(this.stream_, this.doSavePicture_),
-    'video-mode': () =>
-        new cca.views.camera.Video(this.stream_, this.doSavePicture_),
+  this.allModes = {
+    'video-mode': {
+      captureFactory: () =>
+          new cca.views.camera.Video(this.stream_, this.doSavePicture_),
+      isSupported: async () => true,
+      deviceConstraints: cca.views.camera.Modes.videoConstraits,
+      nextMode: 'photo-mode',
+    },
+    'photo-mode': {
+      captureFactory: () =>
+          new cca.views.camera.Photo(this.stream_, this.doSavePicture_),
+      isSupported: async () => true,
+      deviceConstraints: cca.views.camera.Modes.photoConstraits,
+      nextMode: 'square-mode',
+    },
+    'square-mode': {
+      captureFactory: () =>
+          new cca.views.camera.Square(this.stream_, this.doSavePicture_),
+      isSupported: async () => true,
+      deviceConstraints: cca.views.camera.Modes.photoConstraits,
+      nextMode: 'portrait-mode',
+    },
+    'portrait-mode': {
+      captureFactory: () =>
+          new cca.views.camera.Portrait(this.stream_, this.doSavePicture_),
+      isSupported: async function(deviceId) {
+        for (const constraints of this.deviceConstraints(deviceId)) {
+          try {
+            var stream = await navigator.mediaDevices.getUserMedia(constraints);
+            const imageCapture =
+                new cca.mojo.ImageCapture(stream.getVideoTracks()[0]);
+            const capabilities = await imageCapture.getPhotoCapabilities();
+            return capabilities.supportedEffects &&
+                capabilities.supportedEffects.includes(
+                    cros.mojom.Effect.PORTRAIT_MODE);
+          } finally {
+            if (stream) {
+              stream.getTracks()[0].stop();
+            }
+          }
+        }
+        return false;
+      },
+      deviceConstraints: cca.views.camera.Modes.photoConstraits,
+      nextMode: 'video-mode',
+    },
   };
 
   // End of properties, seal the object.
@@ -79,6 +120,62 @@
 };
 
 /**
+ * Returns a set of available video constraints.
+ * @param {?string} deviceId Id of video device.
+ * @return {Array<Object>} Result of constraints-candidates.
+ */
+cca.views.camera.Modes.videoConstraits = function(deviceId) {
+  return [
+    {
+      aspectRatio: {ideal: 1.7777777778},
+      width: {min: 1280},
+      frameRate: {min: 24},
+    },
+    {
+      width: {min: 640},
+      frameRate: {min: 24},
+    },
+  ].map((constraint) => {
+    // Each passed-in video-constraint will be modified here.
+    if (deviceId) {
+      constraint.deviceId = {exact: deviceId};
+    } else {
+      // As a default camera use the one which is facing the user.
+      constraint.facingMode = {exact: 'user'};
+    }
+    return {audio: true, video: constraint};
+  });
+};
+
+/**
+ * Returns a set of available photo constraints.
+ * @param {?string} deviceId Id of video device.
+ * @return {Array<Object>} Result of constraints-candidates.
+ */
+cca.views.camera.Modes.photoConstraits = function(deviceId) {
+  return [
+    {
+      aspectRatio: {ideal: 1.3333333333},
+      width: {min: 1280},
+      frameRate: {min: 24},
+    },
+    {
+      width: {min: 640},
+      frameRate: {min: 24},
+    },
+  ].map((constraint) => {
+    // Each passed-in video-constraint will be modified here.
+    if (deviceId) {
+      constraint.deviceId = {exact: deviceId};
+    } else {
+      // As a default camera use the one which is facing the user.
+      constraint.facingMode = {exact: 'user'};
+    }
+    return {audio: false, video: constraint};
+  });
+};
+
+/**
  * Switches mode to either video-recording or photo-taking.
  * @param {string} mode Class name of the switching mode.
  * @private
@@ -87,23 +184,50 @@
   if (!cca.state.get('streaming') || cca.state.get('taking')) {
     return;
   }
-  Object.keys(this.modeFactories_).forEach((m) => cca.state.set(m, m == mode));
+  Object.keys(this.allModes).forEach((m) => cca.state.set(m, m == mode));
   cca.state.set('mode-switching', true);
   this.doSwitchMode_().then(() => cca.state.set('mode-switching', false));
 };
 
 /**
+ * Gets all the supported modes and all their constraints pairs for given
+ * deviceId.
+ * @async
+ * @param {?string} deviceId Id of updated video device.
+ * @return {Array<[string, Object]>} Array of supported mode name and
+ *     constraints pairs for given deviceId. Mode values in array start with
+ *     current mode and follow predefined retry order.
+ */
+cca.views.camera.Modes.prototype.getConstraitsForModes =
+    async function(deviceId) {
+  const tried = {};
+  const results = [];
+  let mode = Object.keys(this.allModes).find(cca.state.get);
+  while (!tried[mode]) {
+    const m = this.allModes[mode];
+    tried[mode] = true;
+    if (await m.isSupported(deviceId)) {
+      results.push(...m.deviceConstraints(deviceId).map(
+          (constraints) => [mode, constraints]));
+    }
+    mode = m.nextMode;
+  }
+  return results;
+};
+
+/**
  * Creates and updates new current mode object.
  * @async
+ * @param {string} mode Classname of mode to be updated.
  * @param {MediaStream} stream Stream of the new switching mode.
  */
-cca.views.camera.Modes.prototype.update = async function(stream) {
+cca.views.camera.Modes.prototype.updateMode = async function(mode, stream) {
   if (this.current != null) {
     await this.current.stopCapture();
   }
+  Object.keys(this.allModes).forEach((m) => cca.state.set(m, m == mode));
   this.stream_ = stream;
-  var mode = Object.keys(this.modeFactories_).find(cca.state.get);
-  this.current = this.modeFactories_[mode]();
+  this.current = this.allModes[mode].captureFactory();
 };
 
 /**
@@ -323,7 +447,7 @@
 
   /**
    * ImageCapture object to capture still photos.
-   * @type {ImageCapture}
+   * @type {?ImageCapture}
    * @private
    */
   this.imageCapture_ = null;
@@ -433,3 +557,79 @@
     img.src = URL.createObjectURL(blob);
   });
 };
+
+/**
+ * Portrait mode capture controller.
+ * @param {MediaStream} stream
+ * @param {function(?Blob, boolean): Promise} doSavePicture
+ * @constructor
+ */
+cca.views.camera.Portrait = function(stream, doSavePicture) {
+  cca.views.camera.Mode.call(this, stream, doSavePicture);
+
+  /**
+   * ImageCapture object to capture still photos.
+   * @type {?cca.mojo.ImageCapture}
+   * @private
+   */
+  this.crosImageCapture_ = null;
+
+  // End of properties, seal the object.
+  Object.seal(this);
+};
+
+cca.views.camera.Portrait.prototype = {
+  __proto__: cca.views.camera.Mode.prototype,
+};
+
+/**
+ * @override
+ */
+cca.views.camera.Portrait.prototype.start_ = async function() {
+  if (this.crosImageCapture_ == null) {
+    try {
+      this.crosImageCapture_ =
+          new cca.mojo.ImageCapture(this.stream_.getVideoTracks()[0]);
+    } catch (e) {
+      cca.toast.show('error_msg_take_photo_failed');
+      throw e;
+    }
+  }
+  const photoCapabilities = await this.crosImageCapture_.getPhotoCapabilities();
+  const photoSettings = {
+    imageWidth: photoCapabilities.imageWidth.max,
+    imageHeight: photoCapabilities.imageHeight.max,
+  };
+  try {
+    var [reference, portrait] = this.crosImageCapture_.takePhoto(
+        photoSettings, [cros.mojom.Effect.PORTRAIT_MODE]);
+  } catch (e) {
+    cca.toast.show('error_msg_take_photo_failed');
+    throw e;
+  }
+  let filenamer = new cca.models.Filenamer();
+  let playSound = false;
+  const [refSave, portraitSave] = [reference, portrait].map(async (p) => {
+    const isPortrait = Object.is(p, portrait);
+    try {
+      var blob = await p;
+    } catch (e) {
+      cca.toast.show(
+          isPortrait ? 'error_msg_take_portrait_photo_failed' :
+                       'error_msg_take_photo_failed');
+      throw e;
+    }
+    if (!playSound) {
+      playSound = true;
+      cca.sound.play('#sound-shutter');
+    }
+    await this.doSavePicture_(blob, true, filenamer.newBurstName(!isPortrait));
+  });
+  try {
+    await portraitSave;
+  } catch (e) {
+    // Portrait image may failed due to absence of human faces.
+    // TODO(inker): Log non-intended error.
+  }
+  await refSave;
+};
diff --git a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings.grd b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings.grd
index 8b463f71..a5eac502 100644
--- a/chrome/browser/resources/chromeos/camera/src/strings/camera_strings.grd
+++ b/chrome/browser/resources/chromeos/camera/src/strings/camera_strings.grd
@@ -173,9 +173,12 @@
       <message desc="Confirmation message before removing a selected item from the gallery. Expects a file name to be passed in." name="IDS_DELETE_CONFIRMATION_MSG">
         Do you really want to remove <ph name="file">$1<ex>IMG_20160520_000000.jpg</ex></ph>?
       </message>
-      <message desc="Label for the button to switch to take photo mode." name="IDS_SWITCH_TAKE_PHOTO_BUTTON">
+      <message desc="Label for spoken feedback to read out switch to take photo mode button." name="IDS_SWITCH_TAKE_PHOTO_BUTTON">
         Switch to take photo
       </message>
+      <message desc="Label for switch to take photo mode button." name="IDS_LABEL_SWITCH_TAKE_PHOTO_BUTTON">
+        Photo
+      </message>
       <message desc="Label for the checkbox to toggle the grid shown on preview." name="IDS_TOGGLE_GRID_BUTTON">
         Grid
       </message>
@@ -198,6 +201,9 @@
       <message desc="Error message shown when failing to take photo." name="IDS_ERROR_MSG_TAKE_PHOTO_FAILED">
         Unable to take photo
       </message>
+      <message desc="Error message shown when failing to take portrait photo." name="IDS_ERROR_MSG_TAKE_PORTRAIT_PHOTO_FAILED">
+        Unable to take portrait photo
+      </message>
       <message desc="Short description of the Camera App." name="IDS_DESCRIPTION">
         Take photos and record videos with your camera.
       </message>
@@ -240,9 +246,12 @@
       <message desc="Label for grid-type: golden ratio." name="IDS_LABEL_GRID_GOLDEN">
         Golden ratio
       </message>
-      <message desc="Label for the button to switch to record video mode." name="IDS_SWITCH_RECORD_VIDEO_BUTTON">
+      <message desc="Label for spoken feedback to read out switch to record video mode button." name="IDS_SWITCH_RECORD_VIDEO_BUTTON">
         Switch to record video
       </message>
+      <message desc="Label for switch to record video mode button." name="IDS_LABEL_SWITCH_RECORD_VIDEO_BUTTON">
+        Video
+      </message>
       <message desc="Label for the checkbox to toggle the preview mirroring. Eg. if mirroring is toggled on, preview will be flipped horizontally." name="IDS_TOGGLE_MIRROR_BUTTON">
         Mirroring
       </message>
@@ -252,9 +261,18 @@
       <message desc="Label for the back button." name="IDS_BACK_BUTTON">
         Go back
       </message>
-      <message desc="Label for the button to switch to take square photo mode." name="IDS_SWITCH_TAKE_SQUARE_PHOTO_BUTTON">
+      <message desc="Label for spoken feedback to read out switch to take square photo mode button." name="IDS_SWITCH_TAKE_SQUARE_PHOTO_BUTTON">
+        Switch to take square photo
+      </message>
+      <message desc="Label for switch to take square photo mode button." name="IDS_LABEL_SWITCH_TAKE_SQUARE_PHOTO_BUTTON">
         Square
       </message>
+      <message desc="Label for spoken feedback to read out switch to take portrait photo mode button." name="IDS_SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON">
+        Switch to take portrait photo
+      </message>
+      <message desc="Label for switch to take portrait photo mode button." name="IDS_LABEL_SWITCH_TAKE_PORTRAIT_PHOTO_BUTTON">
+        Portrait
+      </message>
     </messages>
   </release>
 </grit>
diff --git a/chrome/browser/resources/chromeos/camera/src/views/main.html b/chrome/browser/resources/chromeos/camera/src/views/main.html
index 058c7f4..a73ae670 100644
--- a/chrome/browser/resources/chromeos/camera/src/views/main.html
+++ b/chrome/browser/resources/chromeos/camera/src/views/main.html
@@ -21,6 +21,10 @@
     <script src="../js/models/filenamer.js"></script>
     <script src="../js/models/gallery.js"></script>
     <script src="../js/models/filesystem.js"></script>
+    <script src="../js/mojo/mojo_bindings_lite.js"></script>
+    <script src="../js/mojo/image_capture.mojom-lite.js"></script>
+    <script src="../js/mojo/cros_image_capture.mojom-lite.js"></script>
+    <script src="../js/mojo/imagecapture.js"></script>
     <script src="../js/views/view.js"></script>
     <script src="../js/views/gallery_base.js"></script>
     <script src="../js/views/camera.js"></script>
diff --git a/chrome/browser/resources/chromeos/password_change/OWNERS b/chrome/browser/resources/chromeos/password_change/OWNERS
new file mode 100644
index 0000000..a8183f4
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/OWNERS
@@ -0,0 +1 @@
+rsorokin@chromium.org
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.css b/chrome/browser/resources/chromeos/password_change/password_change.css
new file mode 100644
index 0000000..817bc02
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/password_change.css
@@ -0,0 +1,22 @@
+/* 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. */
+
+html,
+body,
+#signin-frame {
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+  padding: 0;
+  width: 100%;
+}
+
+#signin-frame {
+  background-color: #f5f5f5;
+  bottom: 0;
+  left: 0;
+  position: absolute;
+  right: 0;
+  top: 0;
+}
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.html b/chrome/browser/resources/chromeos/password_change/password_change.html
new file mode 100644
index 0000000..9e6980a
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/password_change.html
@@ -0,0 +1,19 @@
+<!doctype html>
+<html dir="$i18n{textdirection}" lang="$i18n{language}">
+<head>
+  <link rel="import" href="chrome://resources/html/polymer.html">
+  <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
+  <link rel="stylesheet" href="chrome://password-change/password_change.css">
+  <script src="chrome://resources/js/cr.js"></script>
+  <script src="chrome://resources/js/cr/event_target.js"></script>
+  <script src="chrome://resources/js/load_time_data.js"></script>
+  <script src="chrome://resources/js/util.js"></script>
+
+  <script src="chrome://password-change/authenticator.js"></script>
+  <script src="chrome://password-change/password_change.js"></script>
+  <script src="chrome://password-change/strings.js"></script>
+</head>
+<body>
+  <webview id="signin-frame" name="signin-frame" allowscaling></webview>
+</body>
+</html>
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.js b/chrome/browser/resources/chromeos/password_change/password_change.js
new file mode 100644
index 0000000..af8dbf4
--- /dev/null
+++ b/chrome/browser/resources/chromeos/password_change/password_change.js
@@ -0,0 +1,44 @@
+// 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.
+
+/**
+ * @fileoverview An UI component to let user change their IdP password along
+ * with cryptohome password.
+ */
+
+cr.define('insession.password.change', function() {
+  'use strict';
+
+  let authExtHost;
+
+  /**
+   * Initialize the UI.
+   */
+  function initialize() {
+    authExtHost = new cr.samlPasswordChange.Authenticator('signin-frame');
+    authExtHost.addEventListener('authCompleted', onAuthCompleted_);
+    chrome.send('initialize');
+  }
+
+  function onAuthCompleted_(e) {
+    chrome.send(
+        'changePassword', [e.detail.old_passwords, e.detail.new_passwords]);
+  }
+
+  /**
+   * Loads auth extension.
+   * @param {Object} data Parameters for auth extension.
+   */
+  function loadAuthExtension(data) {
+    authExtHost.load(data);
+  }
+
+  return {
+    initialize: initialize,
+    loadAuthExtension: loadAuthExtension,
+  };
+});
+
+document.addEventListener(
+    'DOMContentLoaded', insession.password.change.initialize);
diff --git a/chrome/browser/resources/gaia_auth_host/authenticator.js b/chrome/browser/resources/gaia_auth_host/authenticator.js
index 1075652..07aa7c4 100644
--- a/chrome/browser/resources/gaia_auth_host/authenticator.js
+++ b/chrome/browser/resources/gaia_auth_host/authenticator.js
@@ -217,7 +217,8 @@
 
       this.webview_ = typeof webview == 'string' ? $(webview) : webview;
 
-      this.samlHandler_ = new cr.login.SamlHandler(this.webview_);
+      this.samlHandler_ =
+          new cr.login.SamlHandler(this.webview_, false /* startsOnSamlPage */);
       this.webviewEventManager_.addEventListener(
           this.samlHandler_, 'insecureContentBlocked',
           this.onInsecureContentBlocked_.bind(this));
diff --git a/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js b/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js
new file mode 100644
index 0000000..0f5fa46
--- /dev/null
+++ b/chrome/browser/resources/gaia_auth_host/password_change_authenticator.js
@@ -0,0 +1,167 @@
+// 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 src="saml_handler.js">
+// Note: webview_event_manager.js is already included by saml_handler.js.
+
+/**
+ * @fileoverview Support password change on with SAML provider.
+ */
+
+cr.define('cr.samlPasswordChange', function() {
+  'use strict';
+
+  const BLANK_PAGE_URL = 'about:blank';
+
+  /**
+   * Initializes the authenticator component.
+   */
+  class Authenticator extends cr.EventTarget {
+    /**
+     * @param {webview|string} webview The webview element or its ID to host
+     *     IdP web pages.
+     */
+    constructor(webview) {
+      super();
+
+      this.initialFrameUrl_ = null;
+      this.webviewEventManager_ = WebviewEventManager.create();
+
+      this.bindToWebview_(webview);
+
+      window.addEventListener('focus', this.onFocus_.bind(this), false);
+    }
+
+    /**
+     * Reinitializes saml handler.
+     */
+    resetStates() {
+      this.samlHandler_.reset();
+    }
+
+    /**
+     * Resets the webview to the blank page.
+     */
+    resetWebview() {
+      if (this.webview_.src && this.webview_.src != BLANK_PAGE_URL) {
+        this.webview_.src = BLANK_PAGE_URL;
+      }
+    }
+
+    /**
+     * Binds this authenticator to the passed webview.
+     * @param {!Object} webview the new webview to be used by this
+     *     Authenticator.
+     * @private
+     */
+    bindToWebview_(webview) {
+      assert(!this.webview_);
+      assert(!this.samlHandler_);
+
+      this.webview_ = typeof webview == 'string' ? $(webview) : webview;
+
+      this.samlHandler_ =
+          new cr.login.SamlHandler(this.webview_, true /* startsOnSamlPage */);
+      this.webviewEventManager_.addEventListener(
+          this.samlHandler_, 'authPageLoaded',
+          this.onAuthPageLoaded_.bind(this));
+
+      this.webviewEventManager_.addEventListener(
+          this.webview_, 'contentload', this.onContentLoad_.bind(this));
+    }
+
+    /**
+     * Unbinds this Authenticator from the currently bound webview.
+     * @private
+     */
+    unbindFromWebview_() {
+      assert(this.webview_);
+      assert(this.samlHandler_);
+
+      this.webviewEventManager_.removeAllListeners();
+
+      this.webview_ = undefined;
+      this.samlHandler_.unbindFromWebview();
+      this.samlHandler_ = undefined;
+    }
+
+    /**
+     * Re-binds to another webview.
+     * @param {Object} webview the new webview to be used by this Authenticator.
+     */
+    rebindWebview(webview) {
+      this.unbindFromWebview_();
+      this.bindToWebview_(webview);
+    }
+
+    /**
+     * Loads the authenticator component with the given parameters.
+     * @param {AuthMode} authMode Authorization mode.
+     * @param {Object} data Parameters for the authorization flow.
+     */
+    load(data) {
+      this.resetStates();
+      this.initialFrameUrl_ = this.constructInitialFrameUrl_(data);
+      this.samlHandler_.blockInsecureContent = true;
+      this.webview_.src = this.initialFrameUrl_;
+    }
+
+    constructInitialFrameUrl_(data) {
+      let url;
+      url = data.passwordChangeUrl;
+      if (data.userName) {
+        url = appendParam(url, 'username', data.userName);
+      }
+      return url;
+    }
+
+    /**
+     * Invoked when the sign-in page takes focus.
+     * @param {object} e The focus event being triggered.
+     * @private
+     */
+    onFocus_(e) {
+      this.webview_.focus();
+    }
+
+    /**
+     * Sends scraped password and resets the state.
+     * @private
+     */
+    completeAuth_() {
+      const passwordsOnce = this.samlHandler_.getPasswordsScrapedTimes(1);
+      const passwordsTwice = this.samlHandler_.getPasswordsScrapedTimes(2);
+
+      this.dispatchEvent(new CustomEvent('authCompleted', {
+        detail: {
+          old_passwords: passwordsOnce,
+          new_passwords: passwordsTwice,
+        }
+      }));
+      this.resetStates();
+    }
+
+    /**
+     * Invoked when |samlHandler_| fires 'authPageLoaded' event.
+     * @private
+     */
+    onAuthPageLoaded_(e) {
+      this.webview_.focus();
+    }
+
+    /**
+     * Invoked when a new document is loaded.
+     * @private
+     */
+    onContentLoad_(e) {
+      const currentUrl = this.webview_.src;
+      // TODO(rsorokin): Implement more robust check.
+      if (currentUrl.lastIndexOf('status=0') != -1) {
+        this.completeAuth_();
+      }
+    }
+  }
+
+  return {Authenticator: Authenticator};
+});
diff --git a/chrome/browser/resources/gaia_auth_host/post_message_channel.js b/chrome/browser/resources/gaia_auth_host/post_message_channel.js
index 555b5a0..8fd7118b 100644
--- a/chrome/browser/resources/gaia_auth_host/post_message_channel.js
+++ b/chrome/browser/resources/gaia_auth_host/post_message_channel.js
@@ -16,7 +16,8 @@
    * Allowed origins of the hosting page.
    * @type {Array<string>}
    */
-  const ALLOWED_ORIGINS = ['chrome://oobe', 'chrome://chrome-signin'];
+  const ALLOWED_ORIGINS =
+      ['chrome://oobe', 'chrome://chrome-signin', 'chrome://password-change'];
 
   /** @const */
   const PORT_MESSAGE = 'post-message-port-message';
diff --git a/chrome/browser/resources/gaia_auth_host/saml_handler.js b/chrome/browser/resources/gaia_auth_host/saml_handler.js
index f7c8096..c3fabeb 100644
--- a/chrome/browser/resources/gaia_auth_host/saml_handler.js
+++ b/chrome/browser/resources/gaia_auth_host/saml_handler.js
@@ -71,8 +71,12 @@
    * auth IdP pages.
    */
   class SamlHandler extends cr.EventTarget {
-    /** @param {webview} webview */
-    constructor(webview) {
+    /**
+     * @param {webview} webview
+     * @param {boolean} startsOnSamlPage - whether initial URL is already SAML
+     *                  page
+     * */
+    constructor(webview, startsOnSamlPage) {
       super();
 
       /**
@@ -82,17 +86,22 @@
       this.webview_ = webview;
 
       /**
+       * Whether a Saml page is in the webview from the start.
+       */
+      this.startsOnSamlPage_ = startsOnSamlPage;
+
+      /**
        * Whether a Saml IdP page is display in the webview.
        * @type {boolean}
        */
-      this.isSamlPage_ = false;
+      this.isSamlPage_ = this.startsOnSamlPage_;
 
       /**
        * Pending Saml IdP page flag that is set when a SAML_HEADER is received
        * and is copied to |isSamlPage_| in loadcommit.
        * @type {boolean}
        */
-      this.pendingIsSamlPage_ = false;
+      this.pendingIsSamlPage_ = this.startsOnSamlPage_;
 
       /**
        * The last aborted top level url. It is recorded in loadabort event and
@@ -153,8 +162,6 @@
       this.webviewEventManager_.addEventListener(
           this.webview_, 'loadabort', this.onLoadAbort_.bind(this));
       this.webviewEventManager_.addEventListener(
-          this.webview_, 'loadcommit', this.onLoadCommit_.bind(this));
-      this.webviewEventManager_.addEventListener(
           this.webview_, 'permissionrequest',
           this.onPermissionRequest_.bind(this));
 
@@ -162,11 +169,17 @@
           this.webview_.request.onBeforeRequest,
           this.onInsecureRequest.bind(this),
           {urls: ['http://*/*', 'file://*/*', 'ftp://*/*']}, ['blocking']);
-      this.webviewEventManager_.addWebRequestEventListener(
-          this.webview_.request.onHeadersReceived,
-          this.onHeadersReceived_.bind(this),
-          {urls: ['<all_urls>'], types: ['main_frame', 'xmlhttprequest']},
-          ['blocking', 'responseHeaders']);
+
+      if (!this.startsOnSamlPage_) {
+        this.webviewEventManager_.addEventListener(
+            this.webview_, 'loadcommit', this.onLoadCommit_.bind(this));
+
+        this.webviewEventManager_.addWebRequestEventListener(
+            this.webview_.request.onHeadersReceived,
+            this.onHeadersReceived_.bind(this),
+            {urls: ['<all_urls>'], types: ['main_frame', 'xmlhttprequest']},
+            ['blocking', 'responseHeaders']);
+      }
 
       this.webview_.addContentScripts([{
         name: injectedScriptName,
@@ -213,6 +226,19 @@
     }
 
     /**
+     * Gets the list of passwords which were scpared exactly |times| times.
+     * @return {Array<string>}
+     */
+    getPasswordsScrapedTimes(times) {
+      const passwords = {};
+      for (const property in this.passwordStore_) {
+        const key = this.passwordStore_[property];
+        passwords[key] = (passwords[key] + 1) || 1;
+      }
+      return Object.keys(passwords).filter(key => passwords[key] == times);
+    }
+
+    /**
      * Gets the de-duped scraped passwords.
      * @return {Array<string>}
      * @private
@@ -239,8 +265,8 @@
      * Resets all auth states
      */
     reset() {
-      this.isSamlPage_ = false;
-      this.pendingIsSamlPage_ = false;
+      this.isSamlPage_ = this.startsOnSamlPage_;
+      this.pendingIsSamlPage_ = this.startsOnSamlPage_;
       this.passwordStore_ = {};
 
       this.apiInitialized_ = false;
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service.cc b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
index ecf571da..424691d 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service.cc
@@ -714,7 +714,6 @@
              : PasswordReuseEvent::GSUITE;
 }
 
-
 void ChromePasswordProtectionService::MaybeLogPasswordReuseLookupResult(
     content::WebContents* web_contents,
     PasswordReuseLookup::LookupResult result) {
@@ -977,8 +976,14 @@
   auto* identity_manager = IdentityManagerFactory::GetForProfileIfExists(
       profile_->GetOriginalProfile());
 
-  return identity_manager ? identity_manager->GetPrimaryAccountInfoDeprecated()
-                          : AccountInfo();
+  if (!identity_manager)
+    return AccountInfo();
+
+  base::Optional<AccountInfo> primary_account_info =
+      identity_manager->FindExtendedAccountInfoForAccount(
+          identity_manager->GetPrimaryAccountInfo());
+
+  return primary_account_info.value_or(AccountInfo());
 }
 
 GURL ChromePasswordProtectionService::GetEnterpriseChangePasswordURL() const {
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
index 79e20326..5559cf9 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_browsertest.cc
@@ -115,6 +115,7 @@
     // On ChromeOS, the stub user is signed in by default on browsertests.
     CoreAccountInfo account_info =
         identity_test_env()->identity_manager()->GetPrimaryAccountInfo();
+    identity_test_env()->SetRefreshTokenForPrimaryAccount();
 #else
     CoreAccountInfo account_info =
         identity_test_env()->MakePrimaryAccountAvailable(
diff --git a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
index 8b1b539..c463d27 100644
--- a/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/chrome_password_protection_service_unittest.cc
@@ -237,6 +237,7 @@
   }
 
   CoreAccountInfo SetPrimaryAccount(const std::string& email) {
+    identity_test_env()->MakeAccountAvailable(email);
     return identity_test_env()->SetPrimaryAccount(email);
   }
 
diff --git a/chrome/browser/signin/account_fetcher_service_factory.cc b/chrome/browser/signin/account_fetcher_service_factory.cc
deleted file mode 100644
index 8b0f429..0000000
--- a/chrome/browser/signin/account_fetcher_service_factory.cc
+++ /dev/null
@@ -1,54 +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.
-
-#include "chrome/browser/signin/account_fetcher_service_factory.h"
-
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/search/suggestions/image_decoder_impl.h"
-#include "chrome/browser/signin/account_tracker_service_factory.h"
-#include "chrome/browser/signin/chrome_signin_client_factory.h"
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
-#include "components/keyed_service/content/browser_context_dependency_manager.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/signin/core/browser/account_fetcher_service.h"
-#include "components/signin/core/browser/profile_oauth2_token_service.h"
-
-AccountFetcherServiceFactory::AccountFetcherServiceFactory()
-    : BrowserContextKeyedServiceFactory(
-        "AccountFetcherServiceFactory",
-        BrowserContextDependencyManager::GetInstance()) {
-  DependsOn(AccountTrackerServiceFactory::GetInstance());
-  DependsOn(ChromeSigninClientFactory::GetInstance());
-  DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
-}
-
-AccountFetcherServiceFactory::~AccountFetcherServiceFactory() {}
-
-// static
-AccountFetcherService* AccountFetcherServiceFactory::GetForProfile(
-    Profile* profile) {
-  return static_cast<AccountFetcherService*>(
-      GetInstance()->GetServiceForBrowserContext(profile, true));
-}
-
-// static
-AccountFetcherServiceFactory* AccountFetcherServiceFactory::GetInstance() {
-  return base::Singleton<AccountFetcherServiceFactory>::get();
-}
-
-void AccountFetcherServiceFactory::RegisterProfilePrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  AccountFetcherService::RegisterPrefs(registry);
-}
-
-KeyedService* AccountFetcherServiceFactory::BuildServiceInstanceFor(
-    content::BrowserContext* context) const {
-  Profile* profile = Profile::FromBrowserContext(context);
-  AccountFetcherService* service = new AccountFetcherService();
-  service->Initialize(ChromeSigninClientFactory::GetForProfile(profile),
-                      ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
-                      AccountTrackerServiceFactory::GetForProfile(profile),
-                      std::make_unique<suggestions::ImageDecoderImpl>());
-  return service;
-}
diff --git a/chrome/browser/signin/account_fetcher_service_factory.h b/chrome/browser/signin/account_fetcher_service_factory.h
deleted file mode 100644
index 65409546..0000000
--- a/chrome/browser/signin/account_fetcher_service_factory.h
+++ /dev/null
@@ -1,35 +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 CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-#define CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "components/keyed_service/content/browser_context_keyed_service_factory.h"
-
-class AccountFetcherService;
-class Profile;
-
-class AccountFetcherServiceFactory : public BrowserContextKeyedServiceFactory {
- public:
-  static AccountFetcherService* GetForProfile(Profile* profile);
-  static AccountFetcherServiceFactory* GetInstance();
-
- private:
-  friend struct base::DefaultSingletonTraits<AccountFetcherServiceFactory>;
-
-  AccountFetcherServiceFactory();
-  ~AccountFetcherServiceFactory() override;
-
-  // BrowserContextKeyedServiceFactory implementation
-  void RegisterProfilePrefs(
-    user_prefs::PrefRegistrySyncable* registry) override;
-  KeyedService* BuildServiceInstanceFor(
-      content::BrowserContext* context) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(AccountFetcherServiceFactory);
-};
-
-#endif  // CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
diff --git a/chrome/browser/signin/identity_manager_factory.cc b/chrome/browser/signin/identity_manager_factory.cc
index ac6a583..9d4c5f46 100644
--- a/chrome/browser/signin/identity_manager_factory.cc
+++ b/chrome/browser/signin/identity_manager_factory.cc
@@ -9,8 +9,8 @@
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/search/suggestions/image_decoder_impl.h"
 #include "chrome/browser/signin/account_consistency_mode_manager.h"
-#include "chrome/browser/signin/account_fetcher_service_factory.h"
 #include "chrome/browser/signin/account_tracker_service_factory.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
 #include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
@@ -93,6 +93,17 @@
   return signin_manager;
 }
 
+std::unique_ptr<AccountFetcherService> BuildAccountFetcherService(
+    SigninClient* signin_client,
+    OAuth2TokenService* token_service,
+    AccountTrackerService* account_tracker_service) {
+  auto account_fetcher_service = std::make_unique<AccountFetcherService>();
+  account_fetcher_service->Initialize(
+      signin_client, token_service, account_tracker_service,
+      std::make_unique<suggestions::ImageDecoderImpl>());
+  return account_fetcher_service;
+}
+
 }  // namespace
 
 // Subclass that wraps IdentityManager in a KeyedService (as IdentityManager is
@@ -108,6 +119,7 @@
       Profile* profile,
       std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service,
       std::unique_ptr<SigninManagerBase> signin_manager,
+      std::unique_ptr<AccountFetcherService> account_fetcher_service,
       std::unique_ptr<identity::PrimaryAccountMutator> primary_account_mutator,
       std::unique_ptr<identity::AccountsMutator> accounts_mutator,
       std::unique_ptr<identity::AccountsCookieMutatorImpl>
@@ -116,8 +128,8 @@
       : identity::IdentityManager(
             std::move(gaia_cookie_manager_service),
             std::move(signin_manager),
+            std::move(account_fetcher_service),
             ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
-            AccountFetcherServiceFactory::GetForProfile(profile),
             AccountTrackerServiceFactory::GetForProfile(profile),
             std::move(primary_account_mutator),
             std::move(accounts_mutator),
@@ -137,7 +149,6 @@
     : BrowserContextKeyedServiceFactory(
           "IdentityManager",
           BrowserContextDependencyManager::GetInstance()) {
-  DependsOn(AccountFetcherServiceFactory::GetInstance());
   DependsOn(AccountTrackerServiceFactory::GetInstance());
   DependsOn(ChromeSigninClientFactory::GetInstance());
   DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
@@ -202,12 +213,17 @@
       std::make_unique<identity::DiagnosticsProviderImpl>(
           ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
           gaia_cookie_manager_service.get());
+  std::unique_ptr<AccountFetcherService> account_fetcher_service =
+      BuildAccountFetcherService(
+          ChromeSigninClientFactory::GetForProfile(profile),
+          ProfileOAuth2TokenServiceFactory::GetForProfile(profile),
+          AccountTrackerServiceFactory::GetForProfile(profile));
 
   auto identity_manager = std::make_unique<IdentityManagerWrapper>(
       profile, std::move(gaia_cookie_manager_service),
-      std::move(signin_manager), std::move(primary_account_mutator),
-      std::move(accounts_mutator), std::move(accounts_cookie_mutator),
-      std::move(diagnostics_provider));
+      std::move(signin_manager), std::move(account_fetcher_service),
+      std::move(primary_account_mutator), std::move(accounts_mutator),
+      std::move(accounts_cookie_mutator), std::move(diagnostics_provider));
   for (Observer& observer : observer_list_)
     observer.IdentityManagerCreated(identity_manager.get());
   return identity_manager.release();
diff --git a/chrome/browser/signin/identity_test_environment_profile_adaptor.cc b/chrome/browser/signin/identity_test_environment_profile_adaptor.cc
index 45875a7..53a521ec 100644
--- a/chrome/browser/signin/identity_test_environment_profile_adaptor.cc
+++ b/chrome/browser/signin/identity_test_environment_profile_adaptor.cc
@@ -5,7 +5,6 @@
 #include "chrome/browser/signin/identity_test_environment_profile_adaptor.h"
 
 #include "base/bind.h"
-#include "chrome/browser/signin/account_fetcher_service_factory.h"
 #include "chrome/browser/signin/account_tracker_service_factory.h"
 #include "chrome/browser/signin/chrome_signin_client_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
diff --git a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
index 313bd7a..9edbc433 100644
--- a/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_wallet_sync_test.cc
@@ -241,8 +241,16 @@
   EXPECT_EQ(kLaterTime, server_addresses[0]->use_date());
 }
 
+// Disabled due to flakiness: https://crbug.com/947692.
+#if defined(THREAD_SANITIZER)
+#define MAYBE_UpdateServerAddressMetadataWhileNotSyncing \
+  DISABLED_UpdateServerAddressMetadataWhileNotSyncing
+#else
+#define MAYBE_UpdateServerAddressMetadataWhileNotSyncing \
+  UpdateServerAddressMetadataWhileNotSyncing
+#endif
 IN_PROC_BROWSER_TEST_P(TwoClientWalletSyncTest,
-                       UpdateServerAddressMetadataWhileNotSyncing) {
+                       MAYBE_UpdateServerAddressMetadataWhileNotSyncing) {
   GetFakeServer()->SetWalletData(
       {CreateSyncWalletAddress(/*name=*/"address-1", /*company=*/"Company-1"),
        CreateDefaultSyncPaymentsCustomerData()});
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 10ffebd4a..46feca8d 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1559,6 +1559,10 @@
       "webui/chromeos/first_run/first_run_ui.h",
       "webui/chromeos/image_source.cc",
       "webui/chromeos/image_source.h",
+      "webui/chromeos/insession_password_change_handler_chromeos.cc",
+      "webui/chromeos/insession_password_change_handler_chromeos.h",
+      "webui/chromeos/insession_password_change_ui.cc",
+      "webui/chromeos/insession_password_change_ui.h",
       "webui/chromeos/internet_config_dialog.cc",
       "webui/chromeos/internet_config_dialog.h",
       "webui/chromeos/internet_detail_dialog.cc",
diff --git a/chrome/browser/ui/views/passwords/password_pending_view.cc b/chrome/browser/ui/views/passwords/password_pending_view.cc
index 26d13f0..c935f7c 100644
--- a/chrome/browser/ui/views/passwords/password_pending_view.cc
+++ b/chrome/browser/ui/views/passwords/password_pending_view.cc
@@ -25,11 +25,12 @@
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/combobox_model.h"
 #include "ui/base/models/combobox_model_observer.h"
+#include "ui/base/models/simple_combobox_model.h"
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/views/bubble/bubble_frame_view.h"
 #include "ui/views/controls/button/image_button.h"
 #include "ui/views/controls/button/md_text_button.h"
-#include "ui/views/controls/combobox/combobox.h"
+#include "ui/views/controls/editable_combobox/editable_combobox.h"
 #include "ui/views/controls/textfield/textfield.h"
 #include "ui/views/layout/fill_layout.h"
 #include "ui/views/layout/grid_layout.h"
@@ -38,9 +39,6 @@
 
 namespace {
 
-// TODO(pbos): Investigate expicitly obfuscating items inside ComboboxModel.
-constexpr base::char16 kBulletChar = gfx::RenderText::kPasswordReplacementChar;
-
 enum PasswordPendingViewColumnSetType {
   // | | (LEADING, FILL) | | (FILL, FILL) | |
   // Used for the username/password line of the bubble, for the pending view.
@@ -148,45 +146,6 @@
   return passwords;
 }
 
-// A combobox model for password dropdown that allows to reveal/mask values in
-// the combobox.
-class PasswordDropdownModel : public ui::ComboboxModel {
- public:
-  PasswordDropdownModel(bool revealed,
-                        const autofill::ValueElementVector& items)
-      : revealed_(revealed), passwords_(ToValues(items)) {}
-  ~PasswordDropdownModel() override {}
-
-  void SetRevealed(bool revealed) {
-    if (revealed_ == revealed)
-      return;
-    revealed_ = revealed;
-    for (auto& observer : observers_)
-      observer.OnComboboxModelChanged(this);
-  }
-
-  // ui::ComboboxModel:
-  int GetItemCount() const override { return passwords_.size(); }
-  base::string16 GetItemAt(int index) override {
-    return revealed_ ? passwords_[index]
-                     : base::string16(passwords_[index].length(), kBulletChar);
-  }
-  void AddObserver(ui::ComboboxModelObserver* observer) override {
-    observers_.AddObserver(observer);
-  }
-  void RemoveObserver(ui::ComboboxModelObserver* observer) override {
-    observers_.RemoveObserver(observer);
-  }
-
- private:
-  bool revealed_;
-  const std::vector<base::string16> passwords_;
-  // To be called when |masked_| was changed;
-  base::ObserverList<ui::ComboboxModelObserver>::Unchecked observers_;
-
-  DISALLOW_COPY_AND_ASSIGN(PasswordDropdownModel);
-};
-
 std::unique_ptr<views::ToggleImageButton> CreatePasswordViewButton(
     views::ButtonListener* listener,
     bool are_passwords_revealed) {
@@ -212,14 +171,17 @@
 }
 
 // Creates a dropdown from |PasswordForm.all_possible_passwords|.
-std::unique_ptr<views::Combobox> CreatePasswordDropdownView(
+std::unique_ptr<views::EditableCombobox> CreatePasswordDropdownView(
     const autofill::PasswordForm& form,
     bool are_passwords_revealed) {
   DCHECK(!form.all_possible_passwords.empty());
-  std::unique_ptr<views::Combobox> combobox = std::make_unique<views::Combobox>(
-      std::make_unique<PasswordDropdownModel>(are_passwords_revealed,
-                                              form.all_possible_passwords),
-      views::style::CONTEXT_BUTTON, STYLE_PRIMARY_MONOSPACED);
+  auto combobox = std::make_unique<views::EditableCombobox>(
+      std::make_unique<ui::SimpleComboboxModel>(
+          ToValues(form.all_possible_passwords)),
+      /*filter_on_edit=*/false, /*show_on_empty=*/true,
+      views::EditableCombobox::Type::kPassword, views::style::CONTEXT_BUTTON,
+      STYLE_PRIMARY_MONOSPACED);
+  combobox->RevealPasswords(are_passwords_revealed);
   size_t index =
       std::distance(form.all_possible_passwords.begin(),
                     find_if(form.all_possible_passwords.begin(),
@@ -231,9 +193,9 @@
   // we will set the default to first element.
   if (index == form.all_possible_passwords.size()) {
     NOTREACHED();
-    combobox->SetSelectedIndex(0);
+    combobox->SetText(form.all_possible_passwords.at(0).first);
   } else {
-    combobox->SetSelectedIndex(index);
+    combobox->SetText(form.all_possible_passwords.at(index).first);
   }
   combobox->SetAccessibleName(
       l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_PASSWORD_LABEL));
@@ -436,12 +398,10 @@
   are_passwords_revealed_ = !are_passwords_revealed_;
   password_view_button_->SetToggled(are_passwords_revealed_);
   DCHECK(!password_dropdown_ || !password_label_);
-  if (password_dropdown_) {
-    static_cast<PasswordDropdownModel*>(password_dropdown_->model())
-        ->SetRevealed(are_passwords_revealed_);
-  } else {
+  if (password_dropdown_)
+    password_dropdown_->RevealPasswords(are_passwords_revealed_);
+  else
     password_label_->SetObscured(!are_passwords_revealed_);
-  }
 }
 
 void PasswordPendingView::UpdateUsernameAndPasswordInModel() {
@@ -457,13 +417,8 @@
     new_username = static_cast<views::Textfield*>(username_field_)->text();
     base::TrimString(new_username, base::ASCIIToUTF16(" "), &new_username);
   }
-  if (password_editable) {
-    new_password =
-        model()
-            ->pending_password()
-            .all_possible_passwords.at(password_dropdown_->selected_index())
-            .first;
-  }
+  if (password_editable)
+    new_password = password_dropdown_->GetText();
   model()->OnCredentialEdited(std::move(new_username), std::move(new_password));
 }
 
diff --git a/chrome/browser/ui/views/passwords/password_pending_view.h b/chrome/browser/ui/views/passwords/password_pending_view.h
index 7933911..c743207 100644
--- a/chrome/browser/ui/views/passwords/password_pending_view.h
+++ b/chrome/browser/ui/views/passwords/password_pending_view.h
@@ -11,7 +11,7 @@
 #include "ui/views/view.h"
 
 namespace views {
-class Combobox;
+class EditableCombobox;
 class Label;
 class ToggleImageButton;
 }  // namespace views
@@ -79,7 +79,7 @@
 
   // The view for the password value. Only one of |password_dropdown_| and
   // |password_label_| should be available.
-  views::Combobox* password_dropdown_;
+  views::EditableCombobox* password_dropdown_;
   views::Label* password_label_;
 
   bool are_passwords_revealed_;
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc
index e8a09345..94914237 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.cc
@@ -26,11 +26,17 @@
 #include "ui/views/controls/label.h"
 #include "ui/views/controls/progress_bar.h"
 #include "ui/views/layout/box_layout.h"
+#include "ui/views/view_class_properties.h"
+#include "ui/views/window/dialog_client_view.h"
 
 namespace {
 
 PluginVmLauncherView* g_plugin_vm_launcher_view = nullptr;
 
+constexpr gfx::Insets kButtonRowInsets(0, 64, 32, 64);
+constexpr int kWindowWidth = 768;
+constexpr int kWindowHeight = 636;
+
 base::Optional<double> GetFractionComplete(int64_t bytes_processed,
                                            int64_t bytes_to_be_processed) {
   if (bytes_to_be_processed == -1 || bytes_to_be_processed == 0)
@@ -50,20 +56,52 @@
     views::DialogDelegate::CreateDialogWidget(g_plugin_vm_launcher_view,
                                               nullptr, nullptr);
   }
+  g_plugin_vm_launcher_view->GetDialogClientView()->SetButtonRowInsets(
+      kButtonRowInsets);
   g_plugin_vm_launcher_view->GetWidget()->Show();
 }
 
 PluginVmLauncherView::PluginVmLauncherView(Profile* profile)
     : plugin_vm_image_manager_(
           plugin_vm::PluginVmImageManagerFactory::GetForProfile(profile)) {
+  // Layout constants from the spec.
+  gfx::Insets kDialogInsets(60, 64, 0, 64);
+  constexpr gfx::Insets kLowerContainerInsets(12, 0, 52, 0);
   constexpr gfx::Size kLogoImageSize(32, 32);
-  // TODO(https://crbug.com/931703): Add proper insets.
-  constexpr gfx::Insets kMessageInsets(14, 0, 8, 0);
+  constexpr gfx::Size kBigImageSize(264, 264);
+  constexpr int kTitleFontSize = 28;
+  const gfx::FontList kTitleFont({"Google Sans"}, gfx::Font::NORMAL,
+                                 kTitleFontSize, gfx::Font::Weight::NORMAL);
+  constexpr int kTitleHeight = 64;
+  constexpr int kMessageFontSize = 13;
+  const gfx::FontList kMessageFont({"Roboto"}, gfx::Font::NORMAL,
+                                   kMessageFontSize, gfx::Font::Weight::NORMAL);
+  constexpr int kMessageHeight = 32;
+  constexpr int kDownloadProgressMessageFontSize = 12;
+  const gfx::FontList kDownloadProgressMessageFont(
+      {"Roboto"}, gfx::Font::NORMAL, kDownloadProgressMessageFontSize,
+      gfx::Font::Weight::NORMAL);
+  constexpr int kDownloadProgressMessageHeight = 24;
+  constexpr int kProgressBarHeight = 5;
+  constexpr int kProgressBarTopMargin = 32;
 
-  const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
-  SetLayoutManager(std::make_unique<views::BoxLayout>(
-      views::BoxLayout::kVertical,
-      provider->GetInsetsMetric(views::InsetsMetric::INSETS_DIALOG)));
+  // Removed margins so dialog insets specify it instead.
+  set_margins(gfx::Insets());
+
+  views::BoxLayout* layout =
+      SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::kVertical, kDialogInsets));
+
+  views::View* upper_container_view = new views::View();
+  upper_container_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
+      views::BoxLayout::kVertical, gfx::Insets()));
+  AddChildView(upper_container_view);
+
+  views::View* lower_container_view = new views::View();
+  views::BoxLayout* lower_container_layout =
+      lower_container_view->SetLayoutManager(std::make_unique<views::BoxLayout>(
+          views::BoxLayout::kVertical, kLowerContainerInsets));
+  AddChildView(lower_container_view);
 
   views::ImageView* logo_image = new views::ImageView();
   logo_image->SetImageSize(kLogoImageSize);
@@ -71,45 +109,64 @@
       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
           IDR_LOGO_PLUGIN_VM_DEFAULT_32));
   logo_image->SetHorizontalAlignment(views::ImageView::LEADING);
-  AddChildView(logo_image);
+  upper_container_view->AddChildView(logo_image);
 
-  big_message_label_ =
-      new views::Label(GetBigMessage(), views::style::CONTEXT_DIALOG_TITLE);
-  big_message_label_->SetMultiLine(true);
+  big_message_label_ = new views::Label(GetBigMessage(), {kTitleFont});
+  big_message_label_->SetProperty(
+      views::kMarginsKey,
+      new gfx::Insets(kTitleHeight - kTitleFontSize, 0, 0, 0));
+  big_message_label_->SetMultiLine(false);
   big_message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  AddChildView(big_message_label_);
+  upper_container_view->AddChildView(big_message_label_);
 
   views::View* message_container_view = new views::View();
   views::BoxLayout* message_container_layout =
       message_container_view->SetLayoutManager(
-          std::make_unique<views::BoxLayout>(views::BoxLayout::kHorizontal,
-                                             kMessageInsets));
-  AddChildView(message_container_view);
+          std::make_unique<views::BoxLayout>(
+              views::BoxLayout::kHorizontal,
+              gfx::Insets(kMessageHeight - kMessageFontSize, 0, 0, 0)));
+  upper_container_view->AddChildView(message_container_view);
 
-  message_label_ = new views::Label();
+  message_label_ = new views::Label(GetMessage(), {kMessageFont});
   message_label_->SetMultiLine(false);
   message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
   message_container_view->AddChildView(message_label_);
 
-  time_left_message_label_ = new views::Label();
+  time_left_message_label_ = new views::Label(base::string16(), {kMessageFont});
+  time_left_message_label_->SetEnabledColor(gfx::kGoogleGrey700);
+  time_left_message_label_->SetMultiLine(false);
   time_left_message_label_->SetHorizontalAlignment(gfx::ALIGN_RIGHT);
   message_container_view->AddChildView(time_left_message_label_);
   message_container_layout->SetFlexForView(time_left_message_label_, 1);
 
-  progress_bar_ = new views::ProgressBar();
-  AddChildView(progress_bar_);
+  progress_bar_ = new views::ProgressBar(kProgressBarHeight);
+  progress_bar_->SetProperty(
+      views::kMarginsKey,
+      new gfx::Insets(kProgressBarTopMargin - kProgressBarHeight, 0, 0, 0));
+  upper_container_view->AddChildView(progress_bar_);
 
-  download_progress_message_label_ = new views::Label();
-  download_progress_message_label_->SetMultiLine(true);
+  download_progress_message_label_ =
+      new views::Label(base::string16(), {kDownloadProgressMessageFont});
+  download_progress_message_label_->SetEnabledColor(gfx::kGoogleGrey700);
+  download_progress_message_label_->SetProperty(
+      views::kMarginsKey, new gfx::Insets(kDownloadProgressMessageHeight -
+                                              kDownloadProgressMessageFontSize,
+                                          0, 0, 0));
+  download_progress_message_label_->SetMultiLine(false);
   download_progress_message_label_->SetHorizontalAlignment(gfx::ALIGN_LEFT);
-  AddChildView(download_progress_message_label_);
+  upper_container_view->AddChildView(download_progress_message_label_);
 
   big_image_ = new views::ImageView();
+  big_image_->SetImageSize(kBigImageSize);
   big_image_->SetImage(
       ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
           IDR_PLUGIN_VM_LAUNCHER));
-  big_image_->SetHorizontalAlignment(views::ImageView::CENTER);
-  AddChildView(big_image_);
+  lower_container_view->AddChildView(big_image_);
+
+  // Make sure the lower_container_view is pinned to the bottom of the dialog.
+  lower_container_layout->set_main_axis_alignment(
+      views::BoxLayout::MAIN_AXIS_ALIGNMENT_END);
+  layout->SetFlexForView(lower_container_view, 1, true);
 }
 
 int PluginVmLauncherView::GetDialogButtons() const {
@@ -172,10 +229,7 @@
 }
 
 gfx::Size PluginVmLauncherView::CalculatePreferredSize() const {
-  const int width = ChromeLayoutProvider::Get()->GetDistanceMetric(
-      DISTANCE_LARGE_MODAL_DIALOG_PREFERRED_WIDTH);
-  return gfx::Size(width,
-                   GetLayoutManager()->GetPreferredHeightForWidth(this, width));
+  return gfx::Size(kWindowWidth, kWindowHeight);
 }
 
 void PluginVmLauncherView::OnDownloadStarted() {
@@ -287,10 +341,8 @@
 }
 
 void PluginVmLauncherView::OnStateUpdated() {
-  DialogModelChanged();
   SetBigMessageLabel();
   SetMessageLabel();
-  SetDownloadProgressMessageLabel();
   SetBigImage();
 
   const bool progress_bar_visible = state_ == State::START_DOWNLOADING ||
@@ -304,7 +356,13 @@
       state_ == State::DOWNLOADING || state_ == State::UNZIPPING;
   time_left_message_label_->SetVisible(time_left_message_label_visible);
 
-  GetWidget()->SetSize(GetWidget()->non_client_view()->GetPreferredSize());
+  const bool download_progress_message_label_visible =
+      state_ == State::DOWNLOADING;
+  download_progress_message_label_->SetVisible(
+      download_progress_message_label_visible);
+
+  DialogModelChanged();
+  GetWidget()->GetRootView()->Layout();
 }
 
 base::string16 PluginVmLauncherView::GetMessage() const {
@@ -328,6 +386,8 @@
 base::string16 PluginVmLauncherView::GetDownloadProgressMessage(
     uint64_t bytes_downloaded,
     int64_t content_length) const {
+  DCHECK_EQ(state_, State::DOWNLOADING);
+
   base::Optional<double> fraction_complete =
       GetFractionComplete(bytes_downloaded, content_length);
 
@@ -352,8 +412,7 @@
     int64_t processed_bytes,
     int64_t bytes_to_be_processed,
     int64_t bytes_per_sec) const {
-  if (state_ != State::DOWNLOADING && state_ != State::UNZIPPING)
-    return base::string16();
+  DCHECK(state_ == State::DOWNLOADING || state_ == State::UNZIPPING);
 
   base::Optional<double> fraction_complete =
       GetFractionComplete(processed_bytes, bytes_to_be_processed);
@@ -379,11 +438,6 @@
   message_label_->SetVisible(true);
 }
 
-void PluginVmLauncherView::SetDownloadProgressMessageLabel() {
-  download_progress_message_label_->SetVisible(state_ == State::DOWNLOADING);
-  download_progress_message_label_->SetText(GetDownloadProgressMessage(0, -1));
-}
-
 void PluginVmLauncherView::SetBigImage() {
   if (state_ == State::ERROR) {
     big_image_->SetImage(
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h b/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h
index d46c546..84fecd10 100644
--- a/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h
+++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_launcher_view.h
@@ -77,7 +77,6 @@
                                     int64_t bytes_per_sec) const;
   void SetBigMessageLabel();
   void SetMessageLabel();
-  void SetDownloadProgressMessageLabel();
   void SetBigImage();
 
   void StartPluginVmImageDownload();
diff --git a/chrome/browser/ui/views/status_bubble_views.cc b/chrome/browser/ui/views/status_bubble_views.cc
index 8134edc..8358424 100644
--- a/chrome/browser/ui/views/status_bubble_views.cc
+++ b/chrome/browser/ui/views/status_bubble_views.cc
@@ -721,6 +721,14 @@
     AvoidMouse(last_mouse_moved_location_);
 }
 
+int StatusBubbleViews::GetWidthForURL(const base::string16& url_string) {
+  // Get the width of the elided url
+  int elided_url_width = gfx::GetStringWidth(url_string, GetFont());
+  // Add proper paddings
+  return elided_url_width + (kShadowThickness * 2) + kTextPositionX +
+         kTextHorizPadding + 1;
+}
+
 void StatusBubbleViews::SetStatus(const base::string16& status_text) {
   if (size_.IsEmpty())
     return;  // We have no bounds, don't attempt to show the popup.
@@ -737,8 +745,10 @@
 
   InitPopup();
   view_->SetText(!status_text_.empty() ? status_text_ : url_text_, true);
-  if (!status_text_.empty())
+  if (!status_text_.empty()) {
+    SetBubbleWidth(GetStandardStatusBubbleWidth());
     view_->ShowInstantly();
+  }
 }
 
 void StatusBubbleViews::SetURL(const GURL& url) {
@@ -760,12 +770,6 @@
     return;
   }
 
-  // Reset expansion state only when bubble is completely hidden.
-  if (view_->state() == StatusView::BUBBLE_HIDDEN) {
-    is_expanded_ = false;
-    SetBubbleWidth(GetStandardStatusBubbleWidth());
-  }
-
   // Set Elided Text corresponding to the GURL object.
   int text_width = static_cast<int>(size_.width() - (kShadowThickness * 2) -
                                     kTextPositionX - kTextHorizPadding - 1);
@@ -776,8 +780,28 @@
   // correctly.
   url_text_ = base::i18n::GetDisplayStringInLTRDirectionality(url_text_);
 
+  // Get the width of the URL if the bubble width is the maximum size.
+  base::string16 full_size_elided_url =
+      url_formatter::ElideUrl(url, GetFont(), GetMaxStatusBubbleWidth());
+  int url_width = GetWidthForURL(full_size_elided_url);
+
+  // Get the width for the url if it is unexpanded.
+  int unexpanded_width = std::min(url_width, GetStandardStatusBubbleWidth());
+
+  // Reset expansion state only when bubble is completely hidden.
+  if (view_->state() == StatusView::BUBBLE_HIDDEN) {
+    is_expanded_ = false;
+    url_text_ = url_formatter::ElideUrl(url, GetFont(), unexpanded_width);
+    SetBubbleWidth(unexpanded_width);
+  }
+
   if (IsFrameVisible()) {
-    view_->SetText(url_text_, true);
+    // If bubble is not expanded & not empty, make it fit properly in the
+    // unexpanded bubble
+    if (!is_expanded_ & !url.is_empty()) {
+      url_text_ = url_formatter::ElideUrl(url, GetFont(), unexpanded_width);
+      SetBubbleWidth(unexpanded_width);
+    }
 
     CancelExpandTimer();
 
@@ -793,6 +817,7 @@
                          expand_timer_factory_.GetWeakPtr()),
           base::TimeDelta::FromMilliseconds(kExpandHoverDelayMS));
     }
+    view_->SetText(url_text_, true);
   }
 }
 
@@ -937,15 +962,10 @@
 void StatusBubbleViews::ExpandBubble() {
   // Elide URL to maximum possible size, then check actual length (it may
   // still be too long to fit) before expanding bubble.
-  int max_status_bubble_width = GetMaxStatusBubbleWidth();
-  const gfx::FontList font_list;
-  url_text_ = url_formatter::ElideUrl(url_, font_list, max_status_bubble_width);
+  url_text_ =
+      url_formatter::ElideUrl(url_, GetFont(), GetMaxStatusBubbleWidth());
   int expanded_bubble_width =
-      std::max(GetStandardStatusBubbleWidth(),
-               std::min(gfx::GetStringWidth(url_text_, font_list) +
-                            (kShadowThickness * 2) + kTextPositionX +
-                            kTextHorizPadding + 1,
-                        max_status_bubble_width));
+      std::min(GetWidthForURL(url_text_), GetMaxStatusBubbleWidth());
   is_expanded_ = true;
   expand_view_->StartExpansion(url_text_, size_.width(), expanded_bubble_width);
 }
diff --git a/chrome/browser/ui/views/status_bubble_views.h b/chrome/browser/ui/views/status_bubble_views.h
index 60e3dc23..28bdc3f 100644
--- a/chrome/browser/ui/views/status_bubble_views.h
+++ b/chrome/browser/ui/views/status_bubble_views.h
@@ -58,6 +58,9 @@
   // Set bubble to new width.
   void SetBubbleWidth(int width);
 
+  // Gets the width that a bubble should be for a given string
+  int GetWidthForURL(const base::string16& url_string);
+
   // Overridden from StatusBubble:
   void SetStatus(const base::string16& status) override;
   void SetURL(const GURL& url) override;
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 18a0cd2..10c13ed 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -25,6 +25,7 @@
 #include "chrome/browser/ui/webui/autofill_internals_ui.h"
 #include "chrome/browser/ui/webui/bluetooth_internals/bluetooth_internals_ui.h"
 #include "chrome/browser/ui/webui/chromeos/account_manager_welcome_ui.h"
+#include "chrome/browser/ui/webui/chromeos/insession_password_change_ui.h"
 #include "chrome/browser/ui/webui/components_ui.h"
 #include "chrome/browser/ui/webui/constrained_web_dialog_ui.h"
 #include "chrome/browser/ui/webui/crashes_ui.h"
@@ -487,6 +488,11 @@
     return &NewWebUI<SetAsDefaultBrowserUI>;
 #endif
 #if defined(OS_CHROMEOS)
+  if (url.host_piece() == chrome::kChromeUIPasswordChangeHost) {
+    if (!base::FeatureList::IsEnabled(features::kInSessionPasswordChange))
+      return nullptr;
+    return &NewWebUI<chromeos::InSessionPasswordChangeUI>;
+  }
   if (url.host_piece() == chrome::kChromeUIAccountManagerWelcomeHost)
     return &NewWebUI<chromeos::AccountManagerWelcomeUI>;
   if (url.host_piece() == chrome::kChromeUIBluetoothPairingHost)
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.cc
new file mode 100644
index 0000000..af50895
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.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 "chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.h"
+
+#include <string>
+
+#include "base/command_line.h"
+#include "base/logging.h"
+#include "base/macros.h"
+#include "base/values.h"
+#include "chrome/browser/chromeos/login/auth/chrome_cryptohome_authenticator.h"
+#include "chrome/browser/chromeos/profiles/profile_helper.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/chrome_features.h"
+#include "chromeos/constants/chromeos_switches.h"
+#include "components/user_manager/user_manager.h"
+
+namespace chromeos {
+
+InSessionPasswordChangeHandler::InSessionPasswordChangeHandler() = default;
+InSessionPasswordChangeHandler::~InSessionPasswordChangeHandler() = default;
+
+void InSessionPasswordChangeHandler::HandleInitialize(
+    const base::ListValue* value) {
+  CHECK(base::FeatureList::IsEnabled(features::kInSessionPasswordChange));
+  AllowJavascript();
+  base::Value params(base::Value::Type::DICTIONARY);
+  const std::string password_change_url =
+      base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
+          switches::kSamlPasswordChangeUrl);
+  params.SetKey("passwordChangeUrl", base::Value(password_change_url));
+  user_manager::User* user =
+      ProfileHelper::Get()->GetUserByProfile(Profile::FromWebUI(web_ui()));
+  if (user)
+    params.SetKey("userName", base::Value(user->GetDisplayEmail()));
+  CallJavascriptFunction("insession.password.change.loadAuthExtension", params);
+}
+
+void InSessionPasswordChangeHandler::HandleChangePassword(
+    const base::ListValue* params) {
+  const base::Value& old_passwords = params->GetList()[0];
+  const base::Value& new_passwords = params->GetList()[1];
+  VLOG(4) << "Scraped " << old_passwords.GetList().size() << " old passwords";
+  VLOG(4) << "Scraped " << new_passwords.GetList().size() << " new passwords";
+  user_manager::User* user =
+      ProfileHelper::Get()->GetUserByProfile(Profile::FromWebUI(web_ui()));
+  user_manager::UserManager::Get()->SaveForceOnlineSignin(user->GetAccountId(),
+                                                          true);
+  if (new_passwords.GetList().size() == 1 &&
+      old_passwords.GetList().size() > 0) {
+    UserContext user_context(*user);
+    user_context.SetKey(Key(new_passwords.GetList()[0].GetString()));
+    authenticator_ = new ChromeCryptohomeAuthenticator(this);
+    authenticator_->MigrateKey(user_context,
+                               old_passwords.GetList()[0].GetString());
+  }
+}
+
+void InSessionPasswordChangeHandler::RegisterMessages() {
+  web_ui()->RegisterMessageCallback(
+      "initialize",
+      base::BindRepeating(&InSessionPasswordChangeHandler::HandleInitialize,
+                          weak_factory_.GetWeakPtr()));
+  web_ui()->RegisterMessageCallback(
+      "changePassword",
+      base::BindRepeating(&InSessionPasswordChangeHandler::HandleChangePassword,
+                          weak_factory_.GetWeakPtr()));
+}
+
+void InSessionPasswordChangeHandler::OnAuthSuccess(
+    const UserContext& user_context) {
+  VLOG(3) << "Cryptohome password is changed.";
+  user_manager::UserManager::Get()->SaveForceOnlineSignin(
+      user_context.GetAccountId(), false);
+  authenticator_.reset();
+}
+
+void InSessionPasswordChangeHandler::OnAuthFailure(const AuthFailure& error) {
+  // TODO(rsorokin): Ask user for the old password
+  VLOG(1) << "Failed to change cryptohome password: " << error.GetErrorString();
+  authenticator_.reset();
+}
+
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.h b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.h
new file mode 100644
index 0000000..aed2376
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.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 CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_HANDLER_CHROMEOS_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_HANDLER_CHROMEOS_H_
+
+#include "base/memory/weak_ptr.h"
+#include "base/values.h"
+#include "chromeos/login/auth/auth_status_consumer.h"
+#include "chromeos/login/auth/cryptohome_authenticator.h"
+#include "content/public/browser/web_ui_message_handler.h"
+
+namespace chromeos {
+
+class InSessionPasswordChangeHandler : public content::WebUIMessageHandler,
+                                       AuthStatusConsumer {
+ public:
+  InSessionPasswordChangeHandler();
+  ~InSessionPasswordChangeHandler() override;
+
+  // content::WebUIMessageHandler:
+  void RegisterMessages() override;
+
+  void HandleInitialize(const base::ListValue*);
+  void HandleChangePassword(const base::ListValue* passwords);
+
+  // AuthStatusConsumer:
+  void OnAuthFailure(const AuthFailure& error) override;
+  void OnAuthSuccess(const UserContext& user_context) override;
+
+ private:
+  scoped_refptr<CryptohomeAuthenticator> authenticator_;
+  base::WeakPtrFactory<InSessionPasswordChangeHandler> weak_factory_{this};
+  DISALLOW_COPY_AND_ASSIGN(InSessionPasswordChangeHandler);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_HANDLER_CHROMEOS_H_
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc
new file mode 100644
index 0000000..fc68374
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.cc
@@ -0,0 +1,44 @@
+// 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/ui/webui/chromeos/insession_password_change_ui.h"
+
+#include <memory>
+
+#include "base/bind.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/webui/chromeos/insession_password_change_handler_chromeos.h"
+#include "chrome/common/chrome_features.h"
+#include "chrome/common/webui_url_constants.h"
+#include "chrome/grit/browser_resources.h"
+#include "chrome/grit/generated_resources.h"
+#include "content/public/browser/web_ui_data_source.h"
+#include "ui/strings/grit/ui_strings.h"
+
+namespace chromeos {
+
+InSessionPasswordChangeUI::InSessionPasswordChangeUI(content::WebUI* web_ui)
+    : ui::WebDialogUI(web_ui) {
+  CHECK(base::FeatureList::IsEnabled(features::kInSessionPasswordChange));
+  content::WebUIDataSource* source =
+      content::WebUIDataSource::Create(chrome::kChromeUIPasswordChangeHost);
+
+  web_ui->AddMessageHandler(std::make_unique<InSessionPasswordChangeHandler>());
+
+  source->SetJsonPath("strings.js");
+
+  source->SetDefaultResource(IDR_PASSWORD_CHANGE_HTML);
+
+  source->AddResourcePath("password_change.css", IDR_PASSWORD_CHANGE_CSS);
+  source->AddResourcePath("authenticator.js",
+                          IDR_PASSWORD_CHANGE_AUTHENTICATOR_JS);
+  source->AddResourcePath("password_change.js", IDR_PASSWORD_CHANGE_JS);
+
+  Profile* profile = Profile::FromWebUI(web_ui);
+  content::WebUIDataSource::Add(profile, source);
+}
+
+InSessionPasswordChangeUI::~InSessionPasswordChangeUI() = default;
+
+}  // namespace chromeos
diff --git a/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h
new file mode 100644
index 0000000..b012a52
--- /dev/null
+++ b/chrome/browser/ui/webui/chromeos/insession_password_change_ui.h
@@ -0,0 +1,25 @@
+// 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_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_UI_H_
+#define CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_UI_H_
+
+#include "base/macros.h"
+#include "ui/web_dialogs/web_dialog_ui.h"
+
+namespace chromeos {
+
+// For chrome:://password-change
+class InSessionPasswordChangeUI : public ui::WebDialogUI {
+ public:
+  explicit InSessionPasswordChangeUI(content::WebUI* web_ui);
+  ~InSessionPasswordChangeUI() override;
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(InSessionPasswordChangeUI);
+};
+
+}  // namespace chromeos
+
+#endif  // CHROME_BROWSER_UI_WEBUI_CHROMEOS_INSESSION_PASSWORD_CHANGE_UI_H_
diff --git a/chrome/browser/vr/model/capturing_state_model.h b/chrome/browser/vr/model/capturing_state_model.h
index 6e5f0d25..367c960 100644
--- a/chrome/browser/vr/model/capturing_state_model.h
+++ b/chrome/browser/vr/model/capturing_state_model.h
@@ -5,8 +5,6 @@
 #ifndef CHROME_BROWSER_VR_MODEL_CAPTURING_STATE_MODEL_H_
 #define CHROME_BROWSER_VR_MODEL_CAPTURING_STATE_MODEL_H_
 
-#include <string>
-
 #include "chrome/browser/vr/vr_base_export.h"
 
 namespace vr {
@@ -17,24 +15,6 @@
   bool screen_capture_enabled = false;
   bool location_access_enabled = false;
   bool bluetooth_connected = false;
-
-  bool operator==(const CapturingStateModel& rhs) const {
-    return audio_capture_enabled == rhs.audio_capture_enabled &&
-           video_capture_enabled == rhs.video_capture_enabled &&
-           screen_capture_enabled == rhs.screen_capture_enabled &&
-           location_access_enabled == rhs.location_access_enabled &&
-           bluetooth_connected == rhs.bluetooth_connected;
-  }
-
-  bool operator!=(const CapturingStateModel& rhs) const {
-    return !(*this == rhs);
-  }
-
-  bool IsAnyCapturingEnabled() const {
-    return audio_capture_enabled || video_capture_enabled ||
-           screen_capture_enabled || location_access_enabled ||
-           bluetooth_connected;
-  }
 };
 
 typedef bool CapturingStateModel::*CapturingStateModelMemberPtr;
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
index 0febaa4..73ed60b 100644
--- a/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
+++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.cc
@@ -7,21 +7,18 @@
 #include <memory>
 
 #include "base/task/post_task.h"
-#include "chrome/browser/content_settings/tab_specific_content_settings.h"
-#include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
-#include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
-#include "chrome/browser/permissions/permission_manager.h"
-#include "chrome/browser/permissions/permission_result.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ssl/security_state_tab_helper.h"
 #include "chrome/browser/vr/metrics/session_metrics_helper.h"
 #include "chrome/browser/vr/service/browser_xr_runtime.h"
 #include "chrome/browser/vr/service/xr_runtime_manager.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
 #include "chrome/browser/vr/win/vr_browser_renderer_thread_win.h"
+#include "components/strings/grit/components_strings.h"
+#include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
-#include "content/public/common/service_manager_connection.h"
-#include "services/device/public/mojom/constants.mojom.h"
-#include "services/service_manager/public/cpp/connector.h"
+#include "content/public/browser/render_process_host.h"
+#include "content/public/browser/render_view_host.h"
 #include "ui/base/l10n/l10n_util.h"
 
 namespace vr {
@@ -29,18 +26,11 @@
 namespace {
 static constexpr base::TimeDelta kPermissionPromptTimeout =
     base::TimeDelta::FromSeconds(5);
-
-static constexpr base::TimeDelta kPollCapturingStateInterval =
-    base::TimeDelta::FromSecondsD(0.2);
-
-const CapturingStateModel g_default_capturing_state;
 }  // namespace
 
 VRUiHostImpl::VRUiHostImpl(device::mojom::XRDeviceId device_id,
                            device::mojom::XRCompositorHostPtr compositor)
-    : compositor_(std::move(compositor)),
-      main_thread_task_runner_(base::ThreadTaskRunnerHandle::Get()),
-      weak_ptr_factory_(this) {
+    : compositor_(std::move(compositor)), weak_ptr_factory_(this) {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DVLOG(1) << __func__;
 
@@ -49,10 +39,6 @@
   if (runtime) {
     runtime->AddObserver(this);
   }
-
-  auto* connector =
-      content::ServiceManagerConnection::GetForProcess()->GetConnector();
-  connector->BindInterface(device::mojom::kServiceName, &geolocation_config_);
 }
 
 VRUiHostImpl::~VRUiHostImpl() {
@@ -123,11 +109,8 @@
   web_contents_ = contents;
   if (contents) {
     StartUiRendering();
-    InitCapturingStates();
     ui_rendering_thread_->SetWebXrPresenting(true);
 
-    PollCapturingState();
-
     PermissionRequestManager::CreateForWebContents(contents);
     permission_request_manager_ =
         PermissionRequestManager::FromWebContents(contents);
@@ -146,8 +129,6 @@
       DVLOG(1) << __func__ << ": No PermissionRequestManager";
     }
   } else {
-    poll_capturing_state_task_.Cancel();
-
     if (ui_rendering_thread_)
       ui_rendering_thread_->SetWebXrPresenting(false);
     StopUiRendering();
@@ -178,7 +159,6 @@
 void VRUiHostImpl::StopUiRendering() {
   DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
   DVLOG(1) << __func__;
-
   ui_rendering_thread_ = nullptr;
 }
 
@@ -205,130 +185,30 @@
 
   SetLocationInfoOnUi();
 
-  if (indicators_visible_) {
-    indicators_visible_ = false;
-    ui_rendering_thread_->SetIndicatorsVisible(false);
-  }
-
   ui_rendering_thread_->SetVisibleExternalPromptNotification(
       ExternalPromptNotificationType::kPromptGenericPermission);
 
-  is_external_prompt_showing_in_headset_ = true;
-  external_prompt_timeout_task_.Reset(
-      base::BindRepeating(&VRUiHostImpl::RemoveHeadsetNotificationPrompt,
-                          weak_ptr_factory_.GetWeakPtr()));
-  main_thread_task_runner_->PostDelayedTask(
-      FROM_HERE, external_prompt_timeout_task_.callback(),
+  is_prompt_showing_in_headset_ = true;
+  current_prompt_sequence_num_++;
+  base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&VRUiHostImpl::RemoveHeadsetNotificationPrompt,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     current_prompt_sequence_num_),
       kPermissionPromptTimeout);
 }
 
 void VRUiHostImpl::OnBubbleRemoved() {
-  external_prompt_timeout_task_.Cancel();
-  RemoveHeadsetNotificationPrompt();
+  RemoveHeadsetNotificationPrompt(current_prompt_sequence_num_);
 }
 
-void VRUiHostImpl::RemoveHeadsetNotificationPrompt() {
-  if (!is_external_prompt_showing_in_headset_)
+void VRUiHostImpl::RemoveHeadsetNotificationPrompt(int prompt_sequence_num) {
+  if (!is_prompt_showing_in_headset_)
     return;
-  is_external_prompt_showing_in_headset_ = false;
+  if (prompt_sequence_num != current_prompt_sequence_num_)
+    return;
+  is_prompt_showing_in_headset_ = false;
   ui_rendering_thread_->SetVisibleExternalPromptNotification(
       ExternalPromptNotificationType::kPromptNone);
-  indicators_shown_start_time_ = base::Time::Now();
 }
-
-void VRUiHostImpl::InitCapturingStates() {
-  active_capturing_ = g_default_capturing_state;
-  potential_capturing_ = g_default_capturing_state;
-
-  DCHECK(web_contents_);
-  PermissionManager* permission_manager = PermissionManager::Get(
-      Profile::FromBrowserContext(web_contents_->GetBrowserContext()));
-  const GURL& origin = web_contents_->GetLastCommittedURL();
-  content::RenderFrameHost* rfh = web_contents_->GetMainFrame();
-  potential_capturing_.audio_capture_enabled =
-      permission_manager
-          ->GetPermissionStatusForFrame(
-              ContentSettingsType::CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, rfh,
-              origin)
-          .content_setting == CONTENT_SETTING_ALLOW;
-  potential_capturing_.video_capture_enabled =
-      permission_manager
-          ->GetPermissionStatusForFrame(
-              ContentSettingsType::CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA,
-              rfh, origin)
-          .content_setting == CONTENT_SETTING_ALLOW;
-  potential_capturing_.location_access_enabled =
-      permission_manager
-          ->GetPermissionStatusForFrame(
-              ContentSettingsType::CONTENT_SETTINGS_TYPE_GEOLOCATION, rfh,
-              origin)
-          .content_setting == CONTENT_SETTING_ALLOW;
-
-  indicators_shown_start_time_ = base::Time::Now();
-  indicators_visible_ = false;
-}
-
-void VRUiHostImpl::PollCapturingState() {
-  poll_capturing_state_task_.Reset(base::BindRepeating(
-      &VRUiHostImpl::PollCapturingState, base::Unretained(this)));
-  main_thread_task_runner_->PostDelayedTask(
-      FROM_HERE, poll_capturing_state_task_.callback(),
-      kPollCapturingStateInterval);
-
-  // Microphone, Camera, location.
-  CapturingStateModel active_capturing = active_capturing_;
-  TabSpecificContentSettings* settings =
-      TabSpecificContentSettings::FromWebContents(web_contents_);
-  if (settings) {
-    const ContentSettingsUsagesState& usages_state =
-        settings->geolocation_usages_state();
-    if (!usages_state.state_map().empty()) {
-      unsigned int state_flags = 0;
-      usages_state.GetDetailedInfo(nullptr, &state_flags);
-      active_capturing.location_access_enabled = !!(
-          state_flags & ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED);
-    }
-    active_capturing.audio_capture_enabled =
-        (settings->GetMicrophoneCameraState() &
-         TabSpecificContentSettings::MICROPHONE_ACCESSED) &&
-        !(settings->GetMicrophoneCameraState() &
-          TabSpecificContentSettings::MICROPHONE_BLOCKED);
-    active_capturing.video_capture_enabled =
-        (settings->GetMicrophoneCameraState() &
-         TabSpecificContentSettings::CAMERA_ACCESSED) &
-        !(settings->GetMicrophoneCameraState() &
-          TabSpecificContentSettings::CAMERA_BLOCKED);
-  }
-
-  // Screen capture, bluetooth.
-  scoped_refptr<MediaStreamCaptureIndicator> indicator =
-      MediaCaptureDevicesDispatcher::GetInstance()
-          ->GetMediaStreamCaptureIndicator();
-  active_capturing.screen_capture_enabled =
-      indicator->IsBeingMirrored(web_contents_);
-  active_capturing.bluetooth_connected =
-      web_contents_->IsConnectedToBluetoothDevice();
-
-  if (active_capturing_ != active_capturing) {
-    indicators_shown_start_time_ = base::Time::Now();
-  }
-
-  active_capturing_ = active_capturing;
-  ui_rendering_thread_->SetCapturingState(
-      active_capturing_, g_default_capturing_state, potential_capturing_);
-
-  if (indicators_shown_start_time_ + kPermissionPromptTimeout >
-      base::Time::Now()) {
-    if (!indicators_visible_ && !is_external_prompt_showing_in_headset_) {
-      indicators_visible_ = true;
-      ui_rendering_thread_->SetIndicatorsVisible(true);
-    }
-  } else {
-    if (indicators_visible_) {
-      indicators_visible_ = false;
-      ui_rendering_thread_->SetIndicatorsVisible(false);
-    }
-  }
-}
-
 }  // namespace vr
diff --git a/chrome/browser/vr/ui_host/vr_ui_host_impl.h b/chrome/browser/vr/ui_host/vr_ui_host_impl.h
index 07d12bb..03f3bd8 100644
--- a/chrome/browser/vr/ui_host/vr_ui_host_impl.h
+++ b/chrome/browser/vr/ui_host/vr_ui_host_impl.h
@@ -5,17 +5,13 @@
 #ifndef CHROME_BROWSER_VR_UI_HOST_VR_UI_HOST_IMPL_H_
 #define CHROME_BROWSER_VR_UI_HOST_VR_UI_HOST_IMPL_H_
 
-#include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "chrome/browser/permissions/permission_request_manager.h"
-#include "chrome/browser/vr/model/capturing_state_model.h"
 #include "chrome/browser/vr/service/browser_xr_runtime.h"
 #include "chrome/browser/vr/service/vr_ui_host.h"
 #include "content/public/browser/web_contents.h"
-#include "services/device/public/mojom/geolocation_config.mojom.h"
 
 namespace vr {
 
@@ -50,28 +46,17 @@
   void OnBubbleAdded() override;
   void OnBubbleRemoved() override;
 
-  void RemoveHeadsetNotificationPrompt();
+  void RemoveHeadsetNotificationPrompt(int prompt_sequence_num);
   void SetLocationInfoOnUi();
 
-  void InitCapturingStates();
-  void PollCapturingState();
-
   device::mojom::XRCompositorHostPtr compositor_;
   std::unique_ptr<VRBrowserRendererThreadWin> ui_rendering_thread_;
   device::mojom::VRDisplayInfoPtr info_;
   content::WebContents* web_contents_ = nullptr;
   PermissionRequestManager* permission_request_manager_ = nullptr;
-  scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner_;
 
-  base::CancelableClosure external_prompt_timeout_task_;
-  bool is_external_prompt_showing_in_headset_ = false;
-
-  CapturingStateModel active_capturing_;
-  CapturingStateModel potential_capturing_;
-  device::mojom::GeolocationConfigPtr geolocation_config_;
-  base::CancelableClosure poll_capturing_state_task_;
-  base::Time indicators_shown_start_time_;
-  bool indicators_visible_ = false;
+  bool is_prompt_showing_in_headset_ = false;
+  int current_prompt_sequence_num_ = 0;
 
   THREAD_CHECKER(thread_checker_);
 
diff --git a/chrome/browser/vr/ui_scene_creator.cc b/chrome/browser/vr/ui_scene_creator.cc
index 58329c02c..984ddb62 100644
--- a/chrome/browser/vr/ui_scene_creator.cc
+++ b/chrome/browser/vr/ui_scene_creator.cc
@@ -685,9 +685,8 @@
 
 std::unique_ptr<UiElement> CreateWebVrIndicator(Model* model,
                                                 UiBrowserInterface* browser,
-                                                IndicatorSpec spec,
-                                                DrawPhase phase) {
-  auto container = Create<Rect>(spec.webvr_name, phase);
+                                                IndicatorSpec spec) {
+  auto container = Create<Rect>(spec.webvr_name, kPhaseOverlayForeground);
   VR_BIND_COLOR(model, container.get(),
                 &ColorScheme::webvr_permission_background, &Rect::SetColor);
   container->set_corner_radius(kWebVrPermissionCornerRadius);
@@ -700,7 +699,7 @@
   auto layout = Create<LinearLayout>(kNone, kPhaseNone, LinearLayout::kRight);
   layout->set_margin(kWebVrPermissionMargin);
 
-  auto icon_element = Create<VectorIcon>(kNone, phase, 128);
+  auto icon_element = Create<VectorIcon>(kNone, kPhaseOverlayForeground, 128);
   VR_BIND_COLOR(model, icon_element.get(),
                 &ColorScheme::webvr_permission_foreground,
                 &VectorIcon::SetColor);
@@ -718,12 +717,12 @@
   std::unique_ptr<UiElement> description_element;
   if (spec.is_url) {
     auto url_text = Create<UrlText>(
-        kNone, phase, kWebVrPermissionFontHeight,
+        kNone, kPhaseOverlayForeground, kWebVrPermissionFontHeight,
         base::BindRepeating(&UiBrowserInterface::OnUnsupportedMode,
                             base::Unretained(browser),
                             UiUnsupportedMode::kUnhandledCodePoint)
 
-    );
+            );
     url_text->SetFieldWidth(kWebVrPermissionTextWidth);
     url_text->AddBinding(VR_BIND_FUNC(GURL, Model, model,
                                       model->location_bar_state.gurl, UrlText,
@@ -737,7 +736,8 @@
     description_element = std::move(url_text);
 
   } else {
-    auto text_element = Create<Text>(kNone, phase, kWebVrPermissionFontHeight);
+    auto text_element = Create<Text>(kNone, kPhaseOverlayForeground,
+                                     kWebVrPermissionFontHeight);
     text_element->SetLayoutMode(kMultiLineFixedWidth);
     text_element->SetAlignment(kTextAlignmentLeft);
     text_element->SetColor(SK_ColorWHITE);
@@ -758,11 +758,12 @@
   return container;
 }
 
-std::unique_ptr<UiElement> CreateHostedUi(Model* model,
-                                          UiBrowserInterface* browser,
-                                          UiElementName name,
-                                          UiElementName element_name,
-                                          float distance) {
+std::unique_ptr<UiElement> CreateHostedUi(
+    Model* model,
+    UiBrowserInterface* browser,
+    UiElementName name,
+    UiElementName element_name,
+    float distance) {
   auto hosted_ui = Create<PlatformUiElement>(element_name, kPhaseForeground);
   hosted_ui->SetSize(kContentWidth * kHostedUiWidthRatio,
                      kContentHeight * kHostedUiHeightRatio);
@@ -941,178 +942,6 @@
   return parent;
 }
 
-#if defined(OS_WIN)
-void BindIndicatorTranscienceForWin(
-    TransientElement* e,
-    Model* model,
-    UiScene* scene,
-    const base::Optional<
-        std::tuple<bool, CapturingStateModel, CapturingStateModel>>& last_value,
-    const std::tuple<bool, CapturingStateModel, CapturingStateModel>& value) {
-  const bool in_web_vr_presentation = model->web_vr_enabled() &&
-                                      model->web_vr.IsImmersiveWebXrVisible() &&
-                                      model->web_vr.has_received_permissions;
-
-  const CapturingStateModel active_capture = std::get<1>(value);
-  const CapturingStateModel potential_capture = std::get<2>(value);
-  const CapturingStateModel last_active_capture =
-      last_value ? std::get<1>(last_value.value()) : CapturingStateModel();
-  const CapturingStateModel last_potential_capture =
-      last_value ? std::get<2>(last_value.value()) : CapturingStateModel();
-
-  // Update the visibility state of the indicators based on the capturing state
-  // diff. potential_capture represents the permissions granted to the site
-  // before the presentation. active_capture members are set when a relevant
-  // device starts to get used.
-  // When the session starts, indicators display which permissions are granted
-  // upfront (struct potential_capture). Then, when a device gets accessed,
-  // an indicator notifies the user about its usage.
-  // The below logic tries to capture this logic.
-  bool initial_toasts = !active_capture.IsAnyCapturingEnabled();
-  if (active_capture != last_active_capture ||
-      potential_capture != last_potential_capture) {
-    auto specs = GetIndicatorSpecs();
-    for (const auto& spec : specs) {
-      bool allowed = potential_capture.*spec.signal;
-      bool triggered =
-          !(last_active_capture.*spec.signal) && (active_capture.*spec.signal);
-      bool show_ui = initial_toasts ? allowed : triggered;
-      SetVisibleInLayout(scene->GetUiElementByName(spec.webvr_name), show_ui);
-    }
-  }
-
-  if (!in_web_vr_presentation) {
-    e->SetVisibleImmediately(false);
-    return;
-  }
-
-  e->SetVisible(true);
-  e->RefreshVisible();
-  SetVisibleInLayout(scene->GetUiElementByName(kWebVrExclusiveScreenToast),
-                     !model->browsing_disabled);
-
-  e->RemoveKeyframeModels(TRANSFORM);
-
-  e->SetTranslate(0, kWebVrPermissionOffsetStart, 0);
-
-  // Build up a keyframe model for the initial transition.
-  std::unique_ptr<cc::KeyframedTransformAnimationCurve> curve(
-      cc::KeyframedTransformAnimationCurve::Create());
-
-  cc::TransformOperations value_1;
-  value_1.AppendTranslate(0, kWebVrPermissionOffsetStart, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta(), value_1,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  cc::TransformOperations value_2;
-  value_2.AppendTranslate(0, kWebVrPermissionOffsetOvershoot, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta::FromMilliseconds(kWebVrPermissionOffsetMs), value_2,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  cc::TransformOperations value_3;
-  value_3.AppendTranslate(0, kWebVrPermissionOffsetFinal, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta::FromMilliseconds(kWebVrPermissionAnimationDurationMs),
-      value_3,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  e->AddKeyframeModel(cc::KeyframeModel::Create(
-      std::move(curve), Animation::GetNextKeyframeModelId(),
-      Animation::GetNextGroupId(), TRANSFORM));
-}
-
-#else
-
-void BindIndicatorTranscience(
-    TransientElement* e,
-    Model* model,
-    UiScene* scene,
-    const base::Optional<std::tuple<bool, bool, bool>>& last_value,
-    const std::tuple<bool, bool, bool>& value) {
-  const bool in_web_vr_presentation = std::get<0>(value);
-  const bool in_long_press = std::get<1>(value);
-  const bool showing_hosted_ui = std::get<2>(value);
-  const bool was_in_long_press = last_value && std::get<1>(last_value.value());
-  const bool was_showing_hosted_ui =
-      last_value && std::get<2>(last_value.value());
-
-  if (!in_web_vr_presentation) {
-    e->SetVisibleImmediately(false);
-    return;
-  }
-
-  // The reason we need the previous state is to disguish the
-  // situation where the app button has been released after a long
-  // press, and the situation when we want to initially show the
-  // indicators.
-  if (was_in_long_press && !in_long_press)
-    return;
-
-  // Similarly, we need to know when we've finished presenting hosted
-  // ui because we should not show indicators then.
-  if (was_showing_hosted_ui && !showing_hosted_ui)
-    return;
-
-  e->SetVisible(true);
-  e->RefreshVisible();
-  SetVisibleInLayout(scene->GetUiElementByName(kWebVrExclusiveScreenToast),
-                     !model->browsing_disabled && !in_long_press);
-
-  auto specs = GetIndicatorSpecs();
-  for (const auto& spec : specs) {
-    SetVisibleInLayout(scene->GetUiElementByName(spec.webvr_name),
-                       model->active_capturing.*spec.signal ||
-                           model->potential_capturing.*spec.signal ||
-                           model->background_capturing.*spec.signal);
-  }
-
-  e->RemoveKeyframeModels(TRANSFORM);
-  if (in_long_press) {
-    // We do not do a translation animation for long press.
-    e->SetTranslate(0, 0, 0);
-    return;
-  }
-
-  e->SetTranslate(0, kWebVrPermissionOffsetStart, 0);
-
-  // Build up a keyframe model for the initial transition.
-  std::unique_ptr<cc::KeyframedTransformAnimationCurve> curve(
-      cc::KeyframedTransformAnimationCurve::Create());
-
-  cc::TransformOperations value_1;
-  value_1.AppendTranslate(0, kWebVrPermissionOffsetStart, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta(), value_1,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  cc::TransformOperations value_2;
-  value_2.AppendTranslate(0, kWebVrPermissionOffsetOvershoot, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta::FromMilliseconds(kWebVrPermissionOffsetMs), value_2,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  cc::TransformOperations value_3;
-  value_3.AppendTranslate(0, kWebVrPermissionOffsetFinal, 0);
-  curve->AddKeyframe(cc::TransformKeyframe::Create(
-      base::TimeDelta::FromMilliseconds(kWebVrPermissionAnimationDurationMs),
-      value_3,
-      cc::CubicBezierTimingFunction::CreatePreset(
-          cc::CubicBezierTimingFunction::EaseType::EASE)));
-
-  e->AddKeyframeModel(cc::KeyframeModel::Create(
-      std::move(curve), Animation::GetNextKeyframeModelId(),
-      Animation::GetNextGroupId(), TRANSFORM));
-}
-
-#endif
-
 }  // namespace
 
 UiSceneCreator::UiSceneCreator(UiBrowserInterface* browser,
@@ -2016,7 +1845,8 @@
       float, Model, model_,
       model->reposition_window_enabled() ? kRepositionContentOpacity : 1.0f,
       UiElement, content_toggle.get(), SetOpacity));
-  scene_->AddParentUiElement(k2dBrowsingForeground, std::move(content_toggle));
+  scene_->AddParentUiElement(k2dBrowsingForeground,
+                             std::move(content_toggle));
 
   auto hit_plane =
       Create<InvisibleHitTarget>(kContentRepositionHitPlane, kPhaseForeground);
@@ -2481,8 +2311,7 @@
   };
   std::vector<MenuItem> menu_items = {
       {
-          kOverflowMenuNewIncognitoTabItem,
-          new_incognito_tab_res_id,
+          kOverflowMenuNewIncognitoTabItem, new_incognito_tab_res_id,
           base::BindRepeating(
               [](UiBrowserInterface* browser) { browser->OpenNewTab(true); }),
           base::BindRepeating([](Model* m) { return !m->incognito; }),
@@ -2974,8 +2803,6 @@
   indicators->SetTranslate(0, 0, kWebVrPermissionDepth);
   indicators->set_margin(kWebVrPermissionOuterMargin);
 
-  DrawPhase phase = kPhaseOverlayForeground;
-
   IndicatorSpec app_button_spec = {kNone,
                                    kWebVrExclusiveScreenToast,
                                    GetVrIcon(kVrRemoveCircleOutlineIcon),
@@ -2984,34 +2811,15 @@
                                    0,
                                    nullptr,
                                    false};
-  indicators->AddChild(
-      CreateWebVrIndicator(model_, browser_, app_button_spec, phase));
+  indicators->AddChild(CreateWebVrIndicator(model_, browser_, app_button_spec));
 
   auto specs = GetIndicatorSpecs();
   for (const auto& spec : specs) {
-    indicators->AddChild(CreateWebVrIndicator(model_, browser_, spec, phase));
+    indicators->AddChild(CreateWebVrIndicator(model_, browser_, spec));
   }
 
   auto parent = CreateTransientParent(kWebVrIndicatorTransience,
                                       kToastTimeoutSeconds, true);
-#if defined(OS_WIN)
-  parent->AddBinding(
-      std::make_unique<
-          Binding<std::tuple<bool, CapturingStateModel, CapturingStateModel>>>(
-          VR_BIND_LAMBDA(
-              [](Model* model) {
-                return std::tuple<bool, CapturingStateModel,
-                                  CapturingStateModel>(
-                    model->web_vr_enabled() &&
-                        model->web_vr.IsImmersiveWebXrVisible() &&
-                        model->web_vr.has_received_permissions,
-                    model->active_capturing, model->potential_capturing);
-              },
-              base::Unretained(model_)),
-          VR_BIND_LAMBDA(BindIndicatorTranscienceForWin,
-                         base::Unretained(parent.get()),
-                         base::Unretained(model_), base::Unretained(scene_))));
-#else
   parent->AddBinding(std::make_unique<Binding<std::tuple<bool, bool, bool>>>(
       VR_BIND_LAMBDA(
           [](Model* model) {
@@ -3023,9 +2831,93 @@
                 model->web_vr.showing_hosted_ui);
           },
           base::Unretained(model_)),
-      VR_BIND_LAMBDA(BindIndicatorTranscience, base::Unretained(parent.get()),
-                     base::Unretained(model_), base::Unretained(scene_))));
-#endif
+      VR_BIND_LAMBDA(
+          [](TransientElement* e, Model* model, UiScene* scene,
+             const base::Optional<std::tuple<bool, bool, bool>>& last_value,
+             const std::tuple<bool, bool, bool>& value) {
+            const bool in_web_vr_presentation = std::get<0>(value);
+            const bool in_long_press = std::get<1>(value);
+            const bool showing_hosted_ui = std::get<2>(value);
+            const bool was_in_long_press =
+                last_value && std::get<1>(last_value.value());
+            const bool was_showing_hosted_ui =
+                last_value && std::get<2>(last_value.value());
+
+            if (!in_web_vr_presentation) {
+              e->SetVisibleImmediately(false);
+              return;
+            }
+
+            // The reason we need the previous state is to disguish the
+            // situation where the app button has been released after a long
+            // press, and the situation when we want to initially show the
+            // indicators.
+            if (was_in_long_press && !in_long_press)
+              return;
+
+            // Similarly, we need to know when we've finished presenting hosted
+            // ui because we should not show indicators then.
+            if (was_showing_hosted_ui && !showing_hosted_ui)
+              return;
+
+            e->SetVisible(true);
+            e->RefreshVisible();
+            SetVisibleInLayout(
+                scene->GetUiElementByName(kWebVrExclusiveScreenToast),
+                !model->browsing_disabled && !in_long_press);
+
+            auto specs = GetIndicatorSpecs();
+            for (const auto& spec : specs) {
+              SetVisibleInLayout(
+                  scene->GetUiElementByName(spec.webvr_name),
+                  model->active_capturing.*spec.signal ||
+                      model->potential_capturing.*spec.signal ||
+                      model->background_capturing.*spec.signal);
+            }
+
+            e->RemoveKeyframeModels(TRANSFORM);
+            if (in_long_press) {
+              // We do not do a translation animation for long press.
+              e->SetTranslate(0, 0, 0);
+              return;
+            }
+
+            e->SetTranslate(0, kWebVrPermissionOffsetStart, 0);
+
+            // Build up a keyframe model for the initial transition.
+            std::unique_ptr<cc::KeyframedTransformAnimationCurve> curve(
+                cc::KeyframedTransformAnimationCurve::Create());
+
+            cc::TransformOperations value_1;
+            value_1.AppendTranslate(0, kWebVrPermissionOffsetStart, 0);
+            curve->AddKeyframe(cc::TransformKeyframe::Create(
+                base::TimeDelta(), value_1,
+                cc::CubicBezierTimingFunction::CreatePreset(
+                    cc::CubicBezierTimingFunction::EaseType::EASE)));
+
+            cc::TransformOperations value_2;
+            value_2.AppendTranslate(0, kWebVrPermissionOffsetOvershoot, 0);
+            curve->AddKeyframe(cc::TransformKeyframe::Create(
+                base::TimeDelta::FromMilliseconds(kWebVrPermissionOffsetMs),
+                value_2,
+                cc::CubicBezierTimingFunction::CreatePreset(
+                    cc::CubicBezierTimingFunction::EaseType::EASE)));
+
+            cc::TransformOperations value_3;
+            value_3.AppendTranslate(0, kWebVrPermissionOffsetFinal, 0);
+            curve->AddKeyframe(cc::TransformKeyframe::Create(
+                base::TimeDelta::FromMilliseconds(
+                    kWebVrPermissionAnimationDurationMs),
+                value_3,
+                cc::CubicBezierTimingFunction::CreatePreset(
+                    cc::CubicBezierTimingFunction::EaseType::EASE)));
+
+            e->AddKeyframeModel(cc::KeyframeModel::Create(
+                std::move(curve), Animation::GetNextKeyframeModelId(),
+                Animation::GetNextGroupId(), TRANSFORM));
+          },
+          base::Unretained(parent.get()), base::Unretained(model_),
+          base::Unretained(scene_))));
 
   auto scaler = std::make_unique<ScaledDepthAdjuster>(kWebVrToastDistance);
   scaler->AddChild(std::move(indicators));
diff --git a/chrome/browser/vr/ui_unittest.cc b/chrome/browser/vr/ui_unittest.cc
index 070be975..e494271 100644
--- a/chrome/browser/vr/ui_unittest.cc
+++ b/chrome/browser/vr/ui_unittest.cc
@@ -1307,7 +1307,6 @@
 
 // Ensures that permissions do not appear after showing hosted UI.
 TEST_F(UiTest, DoNotShowIndicatorsAfterHostedUi) {
-#if !defined(OS_WIN)
   CreateScene(kInWebVr);
   auto browser_ui = ui_->GetBrowserUiWeakPtr();
   browser_ui->SetWebVrMode(true);
@@ -1324,14 +1323,12 @@
   model_->web_vr.showing_hosted_ui = false;
   OnBeginFrame();
   EXPECT_FALSE(IsVisible(kWebVrExclusiveScreenToast));
-#endif
 }
 
 // Ensures that permissions appear on long press, and that when the menu button
 // is released that we do not show the exclusive screen toast. Distinguishing
 // these cases requires knowledge of the previous state.
 TEST_F(UiTest, LongPressMenuButtonInWebVrMode) {
-#if !defined(OS_WIN)
   CreateScene(kInWebVr);
   auto browser_ui = ui_->GetBrowserUiWeakPtr();
   browser_ui->SetWebVrMode(true);
@@ -1363,7 +1360,6 @@
       std::make_unique<InputEvent>(InputEvent::kMenuButtonLongPressEnd));
   ui_->HandleMenuButtonEvents(&events);
   EXPECT_FALSE(model_->menu_button_long_pressed);
-#endif
 }
 
 TEST_F(UiTest, MenuItems) {
diff --git a/chrome/browser/vr/win/graphics_delegate_win.cc b/chrome/browser/vr/win/graphics_delegate_win.cc
index 2a6627e..e156569 100644
--- a/chrome/browser/vr/win/graphics_delegate_win.cc
+++ b/chrome/browser/vr/win/graphics_delegate_win.cc
@@ -304,7 +304,7 @@
 }
 
 void GraphicsDelegateWin::PrepareBufferForBrowserUi() {
-  gl_->ClearColor(0, 0, 0, 0);
+  gl_->ClearColor(0, 1, 0, 1);
   gl_->Clear(GL_COLOR_BUFFER_BIT);
 
   DCHECK(prepared_drawing_buffer_ == DrawingBufferMode::kNone);
diff --git a/chrome/browser/vr/win/scheduler_delegate_win.cc b/chrome/browser/vr/win/scheduler_delegate_win.cc
index 3d171cc8..271224d 100644
--- a/chrome/browser/vr/win/scheduler_delegate_win.cc
+++ b/chrome/browser/vr/win/scheduler_delegate_win.cc
@@ -13,14 +13,13 @@
 
 void SchedulerDelegateWin::OnPose(base::OnceCallback<void()> on_frame_ended,
                                   gfx::Transform head_pose,
-                                  bool draw_overlay,
                                   bool draw_ui) {
   on_frame_ended_ = std::move(on_frame_ended);
   base::TimeTicks now = base::TimeTicks::Now();
-  if (draw_overlay)
-    browser_renderer_->DrawWebXrFrame(now, head_pose);
-  else if (draw_ui)
+  if (draw_ui)
     browser_renderer_->DrawBrowserFrame(now);
+  else
+    browser_renderer_->DrawWebXrFrame(now, head_pose);
 }
 
 void SchedulerDelegateWin::OnPause() {
diff --git a/chrome/browser/vr/win/scheduler_delegate_win.h b/chrome/browser/vr/win/scheduler_delegate_win.h
index f2e0945..1c0c120 100644
--- a/chrome/browser/vr/win/scheduler_delegate_win.h
+++ b/chrome/browser/vr/win/scheduler_delegate_win.h
@@ -17,7 +17,6 @@
   // Tell browser when poses available, when we rendered, etc.
   void OnPose(base::OnceCallback<void()> on_frame_ended,
               gfx::Transform head_pose,
-              bool draw_overlay,
               bool draw_ui);
 
  private:
diff --git a/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc b/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
index 1501421e..16d329e 100644
--- a/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
+++ b/chrome/browser/vr/win/vr_browser_renderer_thread_win.cc
@@ -57,8 +57,6 @@
   started_ = false;
   graphics_ = nullptr;
   scheduler_ = nullptr;
-  ui_ = nullptr;
-  scheduler_ui_ = nullptr;
 }
 
 void VRBrowserRendererThreadWin::SetVRDisplayInfo(
@@ -117,13 +115,6 @@
   OnSpinnerVisibilityChanged(false);
 }
 
-int VRBrowserRendererThreadWin::GetNextRequestId() {
-  current_request_id_++;
-  if (current_request_id_ >= 0x10000)
-    current_request_id_ = 0;
-  return current_request_id_;
-}
-
 void VRBrowserRendererThreadWin::OnWebXrTimeoutImminent() {
   OnSpinnerVisibilityChanged(true);
   scheduler_ui_->OnWebXrTimeoutImminent();
@@ -144,48 +135,16 @@
 
   ui_->SetVisibleExternalPromptNotification(prompt);
 
-  if (overlay_)
-    overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
-                                           draw_state_.ShouldDrawWebXR());
+  overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
+                                         draw_state_.ShouldDrawWebXR());
   if (draw_state_.ShouldDrawUI()) {
-    if (overlay_)  // False only while testing
-      overlay_->RequestNextOverlayPose(
-          base::BindOnce(&VRBrowserRendererThreadWin::OnPose,
-                         base::Unretained(this), GetNextRequestId()));
+    overlay_->RequestNextOverlayPose(base::BindOnce(
+        &VRBrowserRendererThreadWin::OnPose, base::Unretained(this)));
   } else {
     StopOverlay();
   }
 }
 
-void VRBrowserRendererThreadWin::SetIndicatorsVisible(bool visible) {
-  if (!draw_state_.SetIndicatorsVisible(visible))
-    return;
-
-  if (draw_state_.ShouldDrawUI())
-    StartOverlay();
-
-  if (overlay_)
-    overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
-                                           draw_state_.ShouldDrawWebXR());
-  if (draw_state_.ShouldDrawUI()) {
-    if (overlay_)  // False only while testing
-      overlay_->RequestNextOverlayPose(
-          base::BindOnce(&VRBrowserRendererThreadWin::OnPose,
-                         base::Unretained(this), GetNextRequestId()));
-  } else {
-    StopOverlay();
-  }
-}
-
-void VRBrowserRendererThreadWin::SetCapturingState(
-    const CapturingStateModel& active_capturing,
-    const CapturingStateModel& background_capturing,
-    const CapturingStateModel& potential_capturing) {
-  if (ui_)
-    ui_->SetCapturingState(active_capturing, background_capturing,
-                           potential_capturing);
-}
-
 VRBrowserRendererThreadWin*
 VRBrowserRendererThreadWin::GetInstanceForTesting() {
   return instance_for_testing_;
@@ -304,24 +263,22 @@
 }
 
 void VRBrowserRendererThreadWin::OnSpinnerVisibilityChanged(bool visible) {
-  if (!draw_state_.SetSpinnerVisible(visible))
-    return;
-  if (draw_state_.ShouldDrawUI()) {
-    StartOverlay();
-  }
+  if (draw_state_.SetSpinnerVisible(visible)) {
+    if (draw_state_.ShouldDrawUI()) {
+      StartOverlay();
+    }
 
-  if (overlay_) {
-    overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
-                                           draw_state_.ShouldDrawWebXR());
-  }
+    if (overlay_) {
+      overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
+                                             draw_state_.ShouldDrawWebXR());
+    }
 
-  if (draw_state_.ShouldDrawUI()) {
-    if (overlay_)  // False only while testing.
-      overlay_->RequestNextOverlayPose(
-          base::BindOnce(&VRBrowserRendererThreadWin::OnPose,
-                         base::Unretained(this), GetNextRequestId()));
-  } else {
-    StopOverlay();
+    if (draw_state_.ShouldDrawUI()) {
+      overlay_->RequestNextOverlayPose(base::BindOnce(
+          &VRBrowserRendererThreadWin::OnPose, base::Unretained(this)));
+    } else {
+      StopOverlay();
+    }
   }
 }
 
@@ -331,16 +288,12 @@
   StopWebXrTimeout();
 }
 
-void VRBrowserRendererThreadWin::OnPose(int request_id,
-                                        device::mojom::XRFrameDataPtr data) {
-  if (request_id != current_request_id_) {
-    // Old request. Do nothing.
-    return;
-  }
+void VRBrowserRendererThreadWin::OnPose(device::mojom::XRFrameDataPtr data) {
   if (!draw_state_.ShouldDrawUI()) {
     // We shouldn't be showing UI.
     overlay_->SetOverlayAndWebXRVisibility(draw_state_.ShouldDrawUI(),
                                            draw_state_.ShouldDrawWebXR());
+
     if (graphics_)
       graphics_->ResetMemoryBuffer();
     return;
@@ -377,8 +330,7 @@
   // calling the callback if we are destroyed.
   scheduler_->OnPose(base::BindOnce(&VRBrowserRendererThreadWin::SubmitFrame,
                                     base::Unretained(this), std::move(data)),
-                     head_from_world, draw_state_.ShouldDrawWebXR(),
-                     draw_state_.ShouldDrawUI());
+                     head_from_world, draw_state_.ShouldDrawUI());
 }
 
 void VRBrowserRendererThreadWin::SubmitFrame(
@@ -393,28 +345,24 @@
 }
 
 void VRBrowserRendererThreadWin::SubmitResult(bool success) {
-  if (!success && graphics_) {
+  if (!success) {
     graphics_->ResetMemoryBuffer();
   }
-  if (scheduler_ui_ && success)
-    scheduler_ui_->OnWebXrFrameAvailable();
   if (draw_state_.ShouldDrawUI() && started_) {
-    overlay_->RequestNextOverlayPose(
-        base::BindOnce(&VRBrowserRendererThreadWin::OnPose,
-                       base::Unretained(this), GetNextRequestId()));
+    overlay_->RequestNextOverlayPose(base::BindOnce(
+        &VRBrowserRendererThreadWin::OnPose, base::Unretained(this)));
   }
 }
 
 // VRBrowserRendererThreadWin::DrawContentType functions.
 bool VRBrowserRendererThreadWin::DrawState::ShouldDrawUI() {
   return prompt_ != ExternalPromptNotificationType::kPromptNone ||
-         spinner_visible_ || indicators_visible_;
+         spinner_visible_;
 }
 
 bool VRBrowserRendererThreadWin::DrawState::ShouldDrawWebXR() {
-  return (prompt_ == ExternalPromptNotificationType::kPromptNone &&
-          !spinner_visible_) ||
-         indicators_visible_;
+  return prompt_ == ExternalPromptNotificationType::kPromptNone &&
+         !spinner_visible_;
 }
 
 bool VRBrowserRendererThreadWin::DrawState::SetPrompt(
@@ -432,11 +380,4 @@
   return old_ui != ShouldDrawUI() || old_webxr != ShouldDrawWebXR();
 }
 
-bool VRBrowserRendererThreadWin::DrawState::SetIndicatorsVisible(bool visible) {
-  bool old_ui = ShouldDrawUI();
-  bool old_webxr = ShouldDrawWebXR();
-  indicators_visible_ = visible;
-  return old_ui != ShouldDrawUI() || old_webxr != ShouldDrawWebXR();
-}
-
 }  // namespace vr
diff --git a/chrome/browser/vr/win/vr_browser_renderer_thread_win.h b/chrome/browser/vr/win/vr_browser_renderer_thread_win.h
index a8675ee..8204a03 100644
--- a/chrome/browser/vr/win/vr_browser_renderer_thread_win.h
+++ b/chrome/browser/vr/win/vr_browser_renderer_thread_win.h
@@ -9,7 +9,6 @@
 
 #include "base/threading/thread.h"
 #include "chrome/browser/vr/browser_renderer.h"
-#include "chrome/browser/vr/model/capturing_state_model.h"
 #include "chrome/browser/vr/model/web_vr_model.h"
 #include "chrome/browser/vr/service/browser_xr_runtime.h"
 #include "chrome/browser/vr/vr_export.h"
@@ -38,10 +37,6 @@
   // The below function(s) affect(s) whether UI is drawn or not.
   void SetVisibleExternalPromptNotification(
       ExternalPromptNotificationType prompt);
-  void SetIndicatorsVisible(bool visible);
-  void SetCapturingState(const CapturingStateModel& active_capturing,
-                         const CapturingStateModel& background_capturing,
-                         const CapturingStateModel& potential_capturing);
 
   static VRBrowserRendererThreadWin* GetInstanceForTesting();
   BrowserRenderer* GetBrowserRendererForTesting();
@@ -53,7 +48,6 @@
     // State changing methods.
     bool SetPrompt(ExternalPromptNotificationType prompt);
     bool SetSpinnerVisible(bool visible);
-    bool SetIndicatorsVisible(bool visible);
 
     // State querying methods.
     bool ShouldDrawUI();
@@ -64,10 +58,9 @@
         ExternalPromptNotificationType::kPromptNone;
 
     bool spinner_visible_ = false;
-    bool indicators_visible_ = false;
   };
 
-  void OnPose(int request_id, device::mojom::XRFrameDataPtr data);
+  void OnPose(device::mojom::XRFrameDataPtr data);
   void SubmitResult(bool success);
   void SubmitFrame(device::mojom::XRFrameDataPtr data);
   void StartOverlay();
@@ -78,7 +71,6 @@
   void OnWebXrTimedOut();
   void StartWebXrTimeout();
   void StopWebXrTimeout();
-  int GetNextRequestId();
 
   // We need to do some initialization of GraphicsDelegateWin before
   // browser_renderer_, so we first store it in a unique_ptr, then transition
@@ -102,7 +94,6 @@
   DrawState draw_state_;
   bool started_ = false;
   bool webxr_presenting_ = false;
-  int current_request_id_ = 0;
 
   device::mojom::ImmersiveOverlayPtr overlay_;
   device::mojom::VRDisplayInfoPtr display_info_;
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
index c814cd9..6e6abd3 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.cc
@@ -112,19 +112,6 @@
   url_loader_ = std::move(url_loader);
 }
 
-base::Optional<bool> PendingBookmarkAppManager::IsExtensionPresentAndInstalled(
-    const std::string& extension_id) {
-  if (registrar_->IsInstalled(extension_id)) {
-    return base::Optional<bool>(true);
-  }
-
-  if (registrar_->WasExternalAppUninstalledByUser(extension_id)) {
-    return base::Optional<bool>(false);
-  }
-
-  return base::nullopt;
-}
-
 void PendingBookmarkAppManager::MaybeStartNextInstallation() {
   if (current_task_and_callback_)
     return;
@@ -145,23 +132,31 @@
     base::Optional<std::string> extension_id =
         extension_ids_map_.LookupExtensionId(install_options.url);
 
-    if (extension_id) {
-      base::Optional<bool> opt =
-          IsExtensionPresentAndInstalled(extension_id.value());
-      if (opt.has_value()) {
-        bool installed = opt.value();
-        if (installed || !install_options.override_previous_user_uninstall) {
-          // TODO(crbug.com/878262): Handle the case where the app is already
-          // installed but from a different source.
-          std::move(front->callback)
-              .Run(install_options.url,
-                   installed
-                       ? web_app::InstallResultCode::kAlreadyInstalled
-                       : web_app::InstallResultCode::kPreviouslyUninstalled);
-          continue;
-        }
+    if (extension_id.has_value()) {
+      // App is already installed.
+      if (registrar_->IsInstalled(extension_id.value())) {
+        std::move(front->callback)
+            .Run(install_options.url,
+                 web_app::InstallResultCode::kAlreadyInstalled);
+        continue;
       }
+
+      // The app is not installed, but it might have been previously uninstalled
+      // by the user. If that's the case, don't install it again unless
+      // |override_previous_user_uninstall| is true.
+      if (registrar_->WasExternalAppUninstalledByUser(extension_id.value()) &&
+          !install_options.override_previous_user_uninstall) {
+        std::move(front->callback)
+            .Run(install_options.url,
+                 web_app::InstallResultCode::kPreviouslyUninstalled);
+        continue;
+      }
+
+      // If neither of the above conditions applies, the app probably got
+      // uninstalled but it wasn't been removed from the map. Still, we should
+      // fall through an install the app.
     }
+
     StartInstallationTask(std::move(front));
     return;
   }
diff --git a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
index f406f63..9fe29b2 100644
--- a/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
+++ b/chrome/browser/web_applications/extensions/pending_bookmark_app_manager.h
@@ -70,13 +70,6 @@
  private:
   struct TaskAndCallback;
 
-  // Returns (as the base::Optional part) whether or not there is already a
-  // known extension for the given ID. The bool inside the base::Optional is,
-  // when known, whether the extension is installed (true) or uninstalled
-  // (false).
-  base::Optional<bool> IsExtensionPresentAndInstalled(
-      const std::string& extension_id);
-
   void MaybeStartNextInstallation();
 
   void StartInstallationTask(std::unique_ptr<TaskAndCallback> task);
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc
index 7633e48..3e2a10a 100644
--- a/chrome/common/chrome_features.cc
+++ b/chrome/common/chrome_features.cc
@@ -364,6 +364,13 @@
     "IncompatibleApplicationsWarning", base::FEATURE_ENABLED_BY_DEFAULT};
 #endif
 
+#if defined(OS_CHROMEOS)
+// Enables or disables In-Session password change. Mostly for SAML users.
+// TODO(rsorokin): Remove this when launched (https://crbug.com/930109).
+const base::Feature kInSessionPasswordChange{"InSessionPasswordChange",
+                                             base::FEATURE_DISABLED_BY_DEFAULT};
+#endif  // defined(OS_CHROMEOS)
+
 #if !defined(OS_ANDROID)
 // Enables or disables intent picker.
 const base::Feature kIntentPicker {
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h
index 602fa13..050a486 100644
--- a/chrome/common/chrome_features.h
+++ b/chrome/common/chrome_features.h
@@ -232,6 +232,11 @@
 extern const base::Feature kIncompatibleApplicationsWarning;
 #endif
 
+#if defined(OS_CHROMEOS)
+COMPONENT_EXPORT(CHROME_FEATURES)
+extern const base::Feature kInSessionPasswordChange;
+#endif
+
 #if !defined(OS_ANDROID)
 COMPONENT_EXPORT(CHROME_FEATURES)
 extern const base::Feature kIntentPicker;
diff --git a/chrome/common/extensions/api/_api_features.json b/chrome/common/extensions/api/_api_features.json
index d321c7e2..e60cde8e 100644
--- a/chrome/common/extensions/api/_api_features.json
+++ b/chrome/common/extensions/api/_api_features.json
@@ -258,6 +258,7 @@
       "chrome://media-router/*",
       "chrome://mobilesetup/*",
       "chrome://oobe/*",
+      "chrome://password-change/*",
       "chrome://assistant-optin/*"
     ]
   }],
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc
index 9e1cdf2e..a7ebeaf 100644
--- a/chrome/common/webui_url_constants.cc
+++ b/chrome/common/webui_url_constants.cc
@@ -182,6 +182,8 @@
 #endif
 
 #if defined(OS_CHROMEOS)
+const char kChromeUIPasswordChangeHost[] = "password-change";
+const char kChromeUIPasswordChangeUrl[] = "chrome://password-change";
 const char kChromeUIAccountManagerWelcomeHost[] = "account-manager-welcome";
 const char kChromeUIAccountManagerWelcomeURL[] =
     "chrome://account-manager-welcome";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index ad835b4..a57a969 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -160,6 +160,8 @@
 extern const char kChromeUIUserActionsHost[];
 extern const char kChromeUIVersionHost[];
 extern const char kChromeUIVersionURL[];
+extern const char kChromeUIPasswordChangeHost[];
+extern const char kChromeUIPasswordChangeUrl[];
 extern const char kChromeUIWelcomeHost[];
 extern const char kChromeUIWelcomeURL[];
 extern const char kChromeUIWelcomeWin10Host[];
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base.cc b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
index 6e34d1b..ae0afd8 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base.cc
@@ -76,11 +76,12 @@
 
 // Tries to find a user associated to the gaia_id stored in |result| under the
 // key |kKeyId|. If one exists, then this function will fill out |gaia_id|,
-// |username|, |domain| and |sid| with the user's information. If not
-// this function will try to generate a new username derived from the email
-// and fill out only |gaia_id| and |username|. |domain| will always be empty
-// since only local users can be created and |sid| will also be empty until
-// the user is created later on.
+// |username|, |domain| and |sid| with the user's information. If not this
+// function will try to generate a new username derived from the email and fill
+// out only |gaia_id| and |username|. |domain| will always be the local domain
+// since only local users can be created. |sid| will be empty until the user is
+// created later on. |is_consumer_account| will be set to true if the email used
+// to sign in is gmail or googlemail.
 void MakeUsernameForAccount(const base::DictionaryValue* result,
                             base::string16* gaia_id,
                             wchar_t* username,
@@ -88,11 +89,22 @@
                             wchar_t* domain,
                             DWORD domain_length,
                             wchar_t* sid,
-                            DWORD sid_length) {
+                            DWORD sid_length,
+                            bool* is_consumer_account) {
   DCHECK(gaia_id);
   DCHECK(username);
   DCHECK(domain);
   DCHECK(sid);
+  DCHECK(is_consumer_account);
+
+  // Determine if the email is a consumer domain (gmail.com or googlemail.com).
+  base::string16 email = GetDictString(result, kKeyEmail);
+  std::transform(email.begin(), email.end(), email.begin(), ::tolower);
+  base::string16::size_type consumer_domain_pos = email.find(L"@gmail.com");
+  if (consumer_domain_pos == base::string16::npos)
+    consumer_domain_pos = email.find(L"@googlemail.com");
+
+  *is_consumer_account = consumer_domain_pos != base::string16::npos;
 
   *gaia_id = GetDictString(result, kKeyId);
   // First try to detect if this gaia account has been used to create an OS
@@ -114,16 +126,11 @@
   // to preserve the email as much as possible in the username while respecting
   // Windows username rules.  See remarks in
   // https://docs.microsoft.com/en-us/windows/desktop/api/lmaccess/ns-lmaccess-_user_info_0
-  base::string16 os_username = GetDictString(result, kKeyEmail);
-  std::transform(os_username.begin(), os_username.end(), os_username.begin(),
-                 ::tolower);
+  base::string16 os_username = email;
 
-  // If the email ends with @gmail.com or @googlemail.com, strip it.
-  base::string16::size_type at = os_username.find(L"@gmail.com");
-  if (at == base::string16::npos)
-    at = os_username.find(L"@googlemail.com");
-  if (at != base::string16::npos) {
-    os_username.resize(at);
+  // If the email is a consumer domain, strip it.
+  if (consumer_domain_pos != base::string16::npos) {
+    os_username.resize(consumer_domain_pos);
   } else {
     // Strip off well known TLDs.
     std::string username_utf8 =
@@ -182,7 +189,7 @@
                               &output_buffer[0], kBufferSize);
   // output_buffer contains sensitive information like the password. Don't log
   // it.
-  LOGFN(INFO) << "exit_code=" << exit_code;
+  LOGFN(INFO) << "exit_code=" << *exit_code;
 
   if (*exit_code == kUiecAbort) {
     LOGFN(ERROR) << "Aborted hr=" << putHR(hr);
@@ -1529,10 +1536,26 @@
   wchar_t found_username[kWindowsUsernameBufferLength];
   wchar_t found_domain[kWindowsDomainBufferLength];
   wchar_t found_sid[kWindowsSidBufferLength];
+  bool is_consumer_account = false;
   base::string16 gaia_id;
-  MakeUsernameForAccount(
-      result, &gaia_id, found_username, base::size(found_username),
-      found_domain, base::size(found_domain), found_sid, base::size(found_sid));
+  MakeUsernameForAccount(result, &gaia_id, found_username,
+                         base::size(found_username), found_domain,
+                         base::size(found_domain), found_sid,
+                         base::size(found_sid), &is_consumer_account);
+
+  // Disallow consumer accounts when mdm enrollment is enabled and the global
+  // flag to allow consumer accounts is not set.
+  if (MdmEnrollmentEnabled() && is_consumer_account) {
+    DWORD allow_consumer_accounts = 0;
+    if (FAILED(GetGlobalFlag(kRegMdmAllowConsumerAccounts,
+                             &allow_consumer_accounts)) ||
+        allow_consumer_accounts == 0) {
+      LOGFN(ERROR) << "Consumer accounts are not allowed mdm_aca="
+                   << allow_consumer_accounts;
+      *error_text = AllocErrorString(IDS_INVALID_EMAIL_DOMAIN_BASE);
+      return E_FAIL;
+    }
+  }
 
   // If an existing user associated to the gaia id was found, make sure that it
   // is valid for this credential.
diff --git a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
index 0c59237..5bb28a5b 100644
--- a/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
+++ b/chrome/credential_provider/gaiacp/gaia_credential_base_unittests.cc
@@ -463,6 +463,7 @@
 
   // Enforce single user mode for MDM.
   ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmUrl, L"https://mdm.com"));
+  ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmAllowConsumerAccounts, 1));
   ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmSupportsMultiUser, 0));
   GoogleMdmEnrolledStatusForTesting force_success(true);
 
@@ -508,6 +509,7 @@
   FakeAssociatedUserValidator validator;
   FakeInternetAvailabilityChecker internet_checker;
   ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmUrl, L"https://mdm.com"));
+  ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmAllowConsumerAccounts, 1));
   GoogleMdmEnrollmentStatusForTesting force_success(true);
 
   USES_CONVERSION;
@@ -751,5 +753,125 @@
   ASSERT_EQ(S_OK, gaia_cred->Terminate());
 }
 
+// Tests various sign in scenarios with consumer and non-consumer domains.
+// Parameters are:
+// 1. Is mdm enrollment enabled.
+// 2. The mdm_aca reg key setting:
+//    - 0: Set reg key to 0.
+//    - 1: Set reg key to 1.
+//    - 2: Don't set reg key.
+// 3. Whether the mdm_aca reg key is set to 1 or 0.
+// 4. Whether an existing associated user is already present.
+// 5. Whether the user being created (or existing) uses a consumer account.
+class GcpGaiaCredentialBaseConsumerEmailTest
+    : public GcpGaiaCredentialBaseTest,
+      public ::testing::WithParamInterface<std::tuple<bool, int, bool, bool>> {
+};
+
+TEST_P(GcpGaiaCredentialBaseConsumerEmailTest, ConsumerEmailSignin) {
+  USES_CONVERSION;
+  const bool mdm_enabled = std::get<0>(GetParam());
+  const int mdm_consumer_accounts_reg_key_setting = std::get<1>(GetParam());
+  const bool user_created = std::get<2>(GetParam());
+  const bool user_is_consumer = std::get<3>(GetParam());
+
+  FakeAssociatedUserValidator validator;
+  FakeInternetAvailabilityChecker internet_checker;
+  GoogleMdmEnrollmentStatusForTesting force_success(true);
+
+  if (mdm_enabled)
+    ASSERT_EQ(S_OK, SetGlobalFlagForTesting(kRegMdmUrl, L"https://mdm.com"));
+
+  const bool mdm_consumer_accounts_reg_key_set =
+      mdm_consumer_accounts_reg_key_setting >= 0 &&
+      mdm_consumer_accounts_reg_key_setting < 2;
+  if (mdm_consumer_accounts_reg_key_set) {
+    ASSERT_EQ(S_OK,
+              SetGlobalFlagForTesting(kRegMdmAllowConsumerAccounts,
+                                      mdm_consumer_accounts_reg_key_setting));
+  }
+
+  std::string user_email = user_is_consumer ? kDefaultEmail : "foo@imfl.info";
+
+  CComBSTR sid;
+  base::string16 username(user_is_consumer ? L"foo" : L"foo_imfl");
+
+  // Create a fake user that has the same gaia id as the test gaia id.
+  if (user_created) {
+    ASSERT_EQ(S_OK, fake_os_user_manager()->CreateTestOSUser(
+                        username, L"password", L"name", L"comment",
+                        base::UTF8ToUTF16(kDefaultGaiaId),
+                        base::UTF8ToUTF16(user_email), &sid));
+    ASSERT_EQ(2ul, fake_os_user_manager()->GetUserCount());
+  }
+
+  FakeGaiaCredentialProvider provider;
+
+  // Start logon.
+  CComPtr<IGaiaCredential> gaia_cred;
+  CComPtr<ICredentialProviderCredential> cred;
+  ASSERT_EQ(S_OK, CreateCredentialWithProvider(&provider, &gaia_cred, &cred));
+
+  CComPtr<ITestCredential> test;
+  ASSERT_EQ(S_OK, cred.QueryInterface(&test));
+
+  test->SetGlsEmailAddress(user_email);
+
+  ASSERT_EQ(S_OK, run_helper()->StartLogonProcessAndWait(cred));
+
+  bool should_signin_succeed = !mdm_enabled ||
+                               (mdm_consumer_accounts_reg_key_set &&
+                                mdm_consumer_accounts_reg_key_setting) ||
+                               !user_is_consumer;
+
+  // Sign in success.
+  if (should_signin_succeed) {
+    CREDENTIAL_PROVIDER_GET_SERIALIZATION_RESPONSE cpgsr;
+    CREDENTIAL_PROVIDER_CREDENTIAL_SERIALIZATION cpcs;
+    wchar_t* status_text;
+    CREDENTIAL_PROVIDER_STATUS_ICON status_icon;
+    ASSERT_EQ(S_OK, cred->GetSerialization(&cpgsr, &cpcs, &status_text,
+                                           &status_icon));
+    EXPECT_EQ(nullptr, status_text);
+    EXPECT_EQ(CPSI_SUCCESS, status_icon);
+    EXPECT_EQ(CPGSR_RETURN_CREDENTIAL_FINISHED, cpgsr);
+    EXPECT_LT(0u, cpcs.cbSerialization);
+    EXPECT_NE(nullptr, cpcs.rgbSerialization);
+
+    // User should have been associated.
+    EXPECT_EQ(test->GetFinalUsername(), username);
+    // Email should be the same as the default one.
+    EXPECT_EQ(test->GetFinalEmail(), user_email);
+  } else {
+    // Nothing was propagated to the provider.
+    EXPECT_EQ(0u, provider.username().Length());
+    EXPECT_EQ(0u, provider.password().Length());
+    EXPECT_EQ(0u, provider.sid().Length());
+    EXPECT_EQ(FALSE, provider.credentials_changed_fired());
+
+    // Error message concerning invalid domain is sent.
+    EXPECT_STREQ(test->GetErrorText(),
+                 GetStringResource(IDS_INVALID_EMAIL_DOMAIN_BASE).c_str());
+  }
+
+  gaia_cred->Terminate();
+
+  if (user_created) {
+    // No new user should be created.
+    EXPECT_EQ(2ul, fake_os_user_manager()->GetUserCount());
+  } else {
+    // New user created only if their domain is valid for the sign in.
+    EXPECT_EQ(1ul + (should_signin_succeed ? 1ul : 0ul),
+              fake_os_user_manager()->GetUserCount());
+  }
+}
+
+INSTANTIATE_TEST_SUITE_P(,
+                         GcpGaiaCredentialBaseConsumerEmailTest,
+                         ::testing::Combine(::testing::Bool(),
+                                            ::testing::Values(0, 1, 2),
+                                            ::testing::Bool(),
+                                            ::testing::Bool()));
+
 }  // namespace testing
 }  // namespace credential_provider
diff --git a/chrome/credential_provider/gaiacp/mdm_utils.cc b/chrome/credential_provider/gaiacp/mdm_utils.cc
index dadea63..a5442b7 100644
--- a/chrome/credential_provider/gaiacp/mdm_utils.cc
+++ b/chrome/credential_provider/gaiacp/mdm_utils.cc
@@ -28,6 +28,7 @@
 
 constexpr wchar_t kRegMdmUrl[] = L"mdm";
 constexpr wchar_t kRegMdmSupportsMultiUser[] = L"mdm_mu";
+constexpr wchar_t kRegMdmAllowConsumerAccounts[] = L"mdm_aca";
 
 // Overridden in tests to force the MDM enrollment to either succeed or fail.
 enum class EnrollmentStatus {
diff --git a/chrome/credential_provider/gaiacp/mdm_utils.h b/chrome/credential_provider/gaiacp/mdm_utils.h
index a322e76e..877f5bd 100644
--- a/chrome/credential_provider/gaiacp/mdm_utils.h
+++ b/chrome/credential_provider/gaiacp/mdm_utils.h
@@ -23,6 +23,9 @@
 // Determines if multiple users can be added to a system managed by MDM.
 extern const wchar_t kRegMdmSupportsMultiUser[];
 
+// Allow sign in using normal consumer accounts.
+extern const wchar_t kRegMdmAllowConsumerAccounts[];
+
 // Class used in tests to force either a successful on unsuccessful enrollment
 // to google MDM.
 class GoogleMdmEnrollmentStatusForTesting {
diff --git a/chrome/credential_provider/gaiacp/scoped_user_profile.cc b/chrome/credential_provider/gaiacp/scoped_user_profile.cc
index 19ba8b8..5a122f5 100644
--- a/chrome/credential_provider/gaiacp/scoped_user_profile.cc
+++ b/chrome/credential_provider/gaiacp/scoped_user_profile.cc
@@ -17,6 +17,7 @@
 
 #include <Windows.h>
 
+#include <aclapi.h>
 #include <atlcomcli.h>
 #include <atlconv.h>
 #include <dpapi.h>
@@ -27,6 +28,8 @@
 #include <shlwapi.h>
 #include <userenv.h>
 
+#include <vector>
+
 #include "base/bind.h"
 #include "base/callback.h"
 #include "base/files/file_util.h"
@@ -240,6 +243,118 @@
   return hr;
 }
 
+HRESULT CreateDirectoryWithRestrictedAccess(const base::FilePath& path) {
+  if (base::PathExists(path))
+    return S_OK;
+
+  SECURITY_DESCRIPTOR sd;
+  if (!::InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) {
+    LOGFN(ERROR) << "Failed to initialize sd hr="
+                 << HRESULT_FROM_WIN32(::GetLastError());
+    return E_FAIL;
+  }
+
+  PSID everyone_sid = nullptr;
+  PSID creator_owner_sid = nullptr;
+  PSID administrators_sid = nullptr;
+  SID_IDENTIFIER_AUTHORITY everyone_sid_id = SECURITY_WORLD_SID_AUTHORITY;
+  SID_IDENTIFIER_AUTHORITY creator_owner_sid_id =
+      SECURITY_CREATOR_SID_AUTHORITY;
+  SID_IDENTIFIER_AUTHORITY administrators_sid_id = SECURITY_NT_AUTHORITY;
+  BYTE real_owner_sid[SECURITY_MAX_SID_SIZE];
+  DWORD size_owner_sid = base::size(real_owner_sid);
+
+  HRESULT hr = S_OK;
+
+  // Get SIDs for Administrators, everyone, creator owner and local system.
+  if (!::AllocateAndInitializeSid(&everyone_sid_id, 1, SECURITY_WORLD_RID, 0, 0,
+                                  0, 0, 0, 0, 0, &everyone_sid) ||
+      !::AllocateAndInitializeSid(&creator_owner_sid_id, 1,
+                                  SECURITY_CREATOR_OWNER_RID, 0, 0, 0, 0, 0, 0,
+                                  0, &creator_owner_sid) ||
+      !::AllocateAndInitializeSid(
+          &administrators_sid_id, 2, SECURITY_BUILTIN_DOMAIN_RID,
+          DOMAIN_ALIAS_RID_ADMINS, 0, 0, 0, 0, 0, 0, &administrators_sid) ||
+      !::CreateWellKnownSid(WinLocalSystemSid, nullptr, real_owner_sid,
+                            &size_owner_sid)) {
+    hr = HRESULT_FROM_WIN32(::GetLastError());
+    LOGFN(ERROR) << "Failed to get well known sids hr=" << putHR(hr);
+  } else {
+    std::vector<EXPLICIT_ACCESS> ea;
+
+    // Only apply read access to the contents of the folder and not the folder
+    // itself. If read access is given to the folder, then users will be able
+    // to rename the folder (even though they are not allowed to delete it).
+    ea.push_back({GENERIC_READ | STANDARD_RIGHTS_READ,
+                  SET_ACCESS,
+                  SUB_CONTAINERS_AND_OBJECTS_INHERIT | INHERIT_ONLY_ACE,
+                  {nullptr, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_SID,
+                   TRUSTEE_IS_WELL_KNOWN_GROUP,
+                   reinterpret_cast<wchar_t*>(everyone_sid)}});
+
+    // Allow full access for administrators and creator owners.
+    ea.push_back(
+        {GENERIC_ALL | STANDARD_RIGHTS_ALL,
+         SET_ACCESS,
+         SUB_CONTAINERS_AND_OBJECTS_INHERIT,
+         {nullptr, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_SID, TRUSTEE_IS_GROUP,
+          reinterpret_cast<wchar_t*>(administrators_sid)}});
+    ea.push_back(
+        {GENERIC_ALL | STANDARD_RIGHTS_ALL,
+         SET_ACCESS,
+         SUB_CONTAINERS_AND_OBJECTS_INHERIT,
+         {nullptr, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_SID, TRUSTEE_IS_USER,
+          reinterpret_cast<wchar_t*>(creator_owner_sid)}});
+
+    PACL acl = nullptr;
+    DWORD err = ::SetEntriesInAcl(base::size(ea), ea.data(), nullptr, &acl);
+    if (ERROR_SUCCESS != errno) {
+      hr = HRESULT_FROM_WIN32(err);
+      LOGFN(ERROR) << "Failed set sids in acl hr=" << putHR(hr);
+    } else {
+      // Add the ACL to the security descriptor.
+      if (!::SetSecurityDescriptorDacl(&sd, TRUE, acl, FALSE)) {
+        hr = HRESULT_FROM_WIN32(::GetLastError());
+        LOGFN(ERROR) << "Failed to set dacl=" << path << " hr=" << putHR(hr);
+      } else {
+        // Make SYSTEM be the owner of this folder and all its children.
+        if (!::SetSecurityDescriptorOwner(&sd, real_owner_sid, FALSE)) {
+          hr = HRESULT_FROM_WIN32(::GetLastError());
+          LOGFN(ERROR) << "Can't set owner sid hr=" << putHR(hr);
+        } else {
+          // Don't inherit ACE from parents.
+          if (!::SetSecurityDescriptorControl(&sd, SE_DACL_PROTECTED,
+                                              SE_DACL_PROTECTED)) {
+            hr = HRESULT_FROM_WIN32(::GetLastError());
+            LOGFN(ERROR) << "Failed to remove inheritance on descriptor hr="
+                         << putHR(hr);
+          } else {
+            // Finally create the directory with the correct permissions.
+            SECURITY_ATTRIBUTES sa{sizeof(SECURITY_ATTRIBUTES), &sd, FALSE};
+            if (!::CreateDirectory(path.value().c_str(), &sa)) {
+              hr = HRESULT_FROM_WIN32(::GetLastError());
+              LOGFN(ERROR) << "Failed to create profile picture directory="
+                           << path << " hr=" << putHR(hr);
+            }
+          }
+        }
+      }
+
+      if (acl)
+        ::LocalFree(acl);
+    }
+
+    if (everyone_sid)
+      ::FreeSid(everyone_sid);
+    if (creator_owner_sid)
+      ::FreeSid(creator_owner_sid);
+    if (administrators_sid)
+      ::FreeSid(administrators_sid);
+  }
+
+  return hr;
+}
+
 HRESULT UpdateProfilePicturesForWindows8AndNewer(
     const base::string16& sid,
     const base::string16& picture_url,
@@ -271,11 +386,13 @@
     return E_FAIL;
   }
 
-  if (!base::PathExists(account_picture_path) &&
-      !base::CreateDirectory(account_picture_path)) {
-    LOGFN(ERROR) << "Failed to create profile picture directory="
-                 << account_picture_path;
-    return E_FAIL;
+  if (!base::PathExists(account_picture_path)) {
+    HRESULT hr = CreateDirectoryWithRestrictedAccess(account_picture_path);
+    if (FAILED(hr)) {
+      LOGFN(ERROR) << "Failed to create profile picture directory="
+                   << account_picture_path << " hr=" << putHR(hr);
+      return hr;
+    }
   }
 
   base::string16 base_picture_extension = kDefaultProfilePictureFileExtension;
diff --git a/chrome/renderer/autofill/fake_password_generation_driver.cc b/chrome/renderer/autofill/fake_password_generation_driver.cc
index 38c2af3..92caf02 100644
--- a/chrome/renderer/autofill/fake_password_generation_driver.cc
+++ b/chrome/renderer/autofill/fake_password_generation_driver.cc
@@ -19,12 +19,3 @@
   if (binding_.is_bound())
     binding_.FlushForTesting();
 }
-
-void FakePasswordGenerationDriver::GenerationAvailableForForm(
-    const autofill::PasswordForm& form) {
-  called_generation_available_for_form_ = true;
-}
-
-void FakePasswordGenerationDriver::PasswordGenerationRejectedByTyping() {
-  called_password_generation_rejected_by_typing_ = true;
-}
diff --git a/chrome/renderer/autofill/fake_password_generation_driver.h b/chrome/renderer/autofill/fake_password_generation_driver.h
index 75ac3ff6..d7090eb 100644
--- a/chrome/renderer/autofill/fake_password_generation_driver.h
+++ b/chrome/renderer/autofill/fake_password_generation_driver.h
@@ -28,49 +28,25 @@
 
   void Flush();
 
-  bool called_generation_available_for_form() const {
-    return called_generation_available_for_form_;
-  }
-
-  bool called_password_generation_rejected_by_typing() const {
-    return called_password_generation_rejected_by_typing_;
-  }
-
-  void reset_called_generation_available_for_form() {
-    called_generation_available_for_form_ = false;
-  }
-
-  void reset_called_password_generation_rejected_by_typing() {
-    called_password_generation_rejected_by_typing_ = false;
-  }
-
-  // TODO(crbug.com/851021): move all the methods to GMock.
   // autofill::mojom::PasswordGenerationDriver:
+  MOCK_METHOD1(GenerationAvailableForForm,
+               void(const autofill::PasswordForm& password_form));
   MOCK_METHOD2(
       AutomaticGenerationStatusChanged,
       void(bool,
            const base::Optional<
                autofill::password_generation::PasswordGenerationUIData>&));
+  MOCK_METHOD2(ShowPasswordEditingPopup,
+               void(const gfx::RectF& bounds,
+                    const autofill::PasswordForm& form));
+  MOCK_METHOD0(PasswordGenerationRejectedByTyping, void());
   MOCK_METHOD1(PresaveGeneratedPassword,
                void(const autofill::PasswordForm& password_form));
   MOCK_METHOD1(PasswordNoLongerGenerated,
                void(const autofill::PasswordForm& password_form));
-  MOCK_METHOD2(ShowPasswordEditingPopup,
-               void(const gfx::RectF& bounds,
-                    const autofill::PasswordForm& form));
   MOCK_METHOD0(FrameWasScrolled, void());
 
  private:
-  // autofill::mojom::PasswordManagerClient:
-  void GenerationAvailableForForm(const autofill::PasswordForm& form) override;
-  void PasswordGenerationRejectedByTyping() override;
-
-  // Records whether GenerationAvailableForForm() gets called.
-  bool called_generation_available_for_form_ = false;
-
-  // Records whether PasswordGenerationRejecteByTyping() gets called.
-  bool called_password_generation_rejected_by_typing_ = false;
-
   mojo::AssociatedBinding<autofill::mojom::PasswordGenerationDriver> binding_;
 
   DISALLOW_COPY_AND_ASSIGN(FakePasswordGenerationDriver);
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index 35de45a..988b9fa5 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -717,7 +717,7 @@
   }
 
   FakeMojoPasswordManagerDriver fake_driver_;
-  FakePasswordGenerationDriver fake_pw_client_;
+  testing::NiceMock<FakePasswordGenerationDriver> fake_pw_client_;
 
   base::string16 username1_;
   base::string16 username2_;
diff --git a/chrome/renderer/autofill/password_generation_agent_browsertest.cc b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
index 64691d5..24155fdc 100644
--- a/chrome/renderer/autofill/password_generation_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_generation_agent_browsertest.cc
@@ -196,141 +196,35 @@
     kAvailable,
     kUnavailable,
   };
+  enum class GenerationAvailableForFormStatus {
+    kAvailable,
+    kUnavailable,
+  };
 
   PasswordGenerationAgentTest() = default;
 
-  void RegisterMainFrameRemoteInterfaces() override {
-    // Because the test cases only involve the main frame in this test,
-    // the fake password client is only used for the main frame.
-    blink::AssociatedInterfaceProvider* remote_associated_interfaces =
-        view_->GetMainRenderFrame()->GetRemoteAssociatedInterfaces();
-    remote_associated_interfaces->OverrideBinderForTesting(
-        mojom::PasswordGenerationDriver::Name_,
-        base::BindRepeating(
-            &PasswordGenerationAgentTest::BindPasswordManagerClient,
-            base::Unretained(this)));
-    remote_associated_interfaces->OverrideBinderForTesting(
-        mojom::PasswordManagerDriver::Name_,
-        base::BindRepeating(
-            &PasswordGenerationAgentTest::BindPasswordManagerDriver,
-            base::Unretained(this)));
-  }
+  // ChromeRenderViewTest:
+  void RegisterMainFrameRemoteInterfaces() override;
+  void SetUp() override;
+  void TearDown() override;
 
-  void SetUp() override {
-    ChromeRenderViewTest::SetUp();
-
-    // TODO(crbug/862989): Remove workaround preventing non-test classes to bind
-    // fake_driver_ or fake_pw_client_.
-    password_autofill_agent_->GetPasswordManagerDriver();
-    password_generation_->RequestPasswordManagerClientForTesting();
-    base::RunLoop().RunUntilIdle();  // Executes binding the interfaces.
-    // Reject all requests to bind driver/client to anything but the test class:
-    view_->GetMainRenderFrame()
-        ->GetRemoteAssociatedInterfaces()
-        ->OverrideBinderForTesting(
-            mojom::PasswordGenerationDriver::Name_,
-            base::BindRepeating([](mojo::ScopedInterfaceEndpointHandle handle) {
-              handle.reset();
-            }));
-    view_->GetMainRenderFrame()
-        ->GetRemoteAssociatedInterfaces()
-        ->OverrideBinderForTesting(
-            mojom::PasswordManagerDriver::Name_,
-            base::BindRepeating([](mojo::ScopedInterfaceEndpointHandle handle) {
-              handle.reset();
-            }));
-
-    // Necessary for focus changes to work correctly and dispatch blur events
-    // when a field was previously focused.
-    GetWebWidget()->SetFocus(true);
-  }
-
-  void TearDown() override {
-    // Unloading the document may trigger the event.
-    EXPECT_CALL(fake_pw_client_, AutomaticGenerationStatusChanged(false, _))
-        .Times(AtMost(1));
-    ChromeRenderViewTest::TearDown();
-  }
-
-  void LoadHTMLWithUserGesture(const char* html) {
-    LoadHTML(html);
-
-    // Enable show-ime event when element is focused by indicating that a user
-    // gesture has been processed since load.
-    EXPECT_TRUE(SimulateElementClick("dummy"));
-  }
-
-  void FocusField(const char* element_id) {
-    WebDocument document = GetMainFrame()->GetDocument();
-    blink::WebElement element =
-        document.GetElementById(blink::WebString::FromUTF8(element_id));
-    ASSERT_FALSE(element.IsNull());
-    ExecuteJavaScriptForTests(
-        base::StringPrintf("document.getElementById('%s').focus();",
-                           element_id).c_str());
-  }
-
+  void LoadHTMLWithUserGesture(const char* html);
+  void FocusField(const char* element_id);
   void ExpectAutomaticGenerationAvailable(const char* element_id,
-                                          AutomaticGenerationStatus available) {
-    SCOPED_TRACE(testing::Message() << "element_id = " << element_id
-                                    << "available = " << available);
-    if (available == kNotReported) {
-      EXPECT_CALL(fake_pw_client_, AutomaticGenerationStatusChanged(_, _))
-          .Times(0);
-    } else {
-      EXPECT_CALL(fake_pw_client_,
-                  AutomaticGenerationStatusChanged(available == kAvailable, _));
-    }
-    FocusField(element_id);
-    base::RunLoop().RunUntilIdle();
-    testing::Mock::VerifyAndClearExpectations(&fake_pw_client_);
-
-    // Check that aria-autocomplete attribute is set correctly.
-    if (available == kAvailable) {
-      WebDocument doc = GetMainFrame()->GetDocument();
-      WebElement element = doc.GetElementById(WebString::FromUTF8(element_id));
-      EXPECT_EQ("list", element.GetAttribute("aria-autocomplete"));
-    }
-  }
-
+                                          AutomaticGenerationStatus available);
   void ExpectFormClassifierVoteReceived(
       bool received,
-      const base::string16& expected_generation_element) {
-    base::RunLoop().RunUntilIdle();
-    if (received) {
-      ASSERT_TRUE(fake_driver_.called_save_generation_field());
-      EXPECT_EQ(expected_generation_element,
-                fake_driver_.save_generation_field());
-    } else {
-      ASSERT_FALSE(fake_driver_.called_save_generation_field());
-    }
+      const base::string16& expected_generation_element);
+  void SelectGenerationFallbackAndExpect(bool available);
+  void SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus status,
+      int form_index = 0,
+      int field_index = 1);
+  void SetAccountCreationFormsDetectedMessageForUnownedInputs(
+      GenerationAvailableForFormStatus status);
 
-    fake_driver_.reset_save_generation_field();
-  }
-
-  void SelectGenerationFallbackAndExpect(bool available) {
-    if (available) {
-      EXPECT_CALL(*this, UserTriggeredGeneratePasswordReply(
-                             testing::Ne(base::nullopt)));
-    } else {
-      EXPECT_CALL(*this, UserTriggeredGeneratePasswordReply(
-                             testing::Eq(base::nullopt)));
-    }
-    password_generation_->UserTriggeredGeneratePassword(base::BindOnce(
-        &PasswordGenerationAgentTest::UserTriggeredGeneratePasswordReply,
-        base::Unretained(this)));
-    testing::Mock::VerifyAndClearExpectations(this);
-  }
-
-  void BindPasswordManagerDriver(mojo::ScopedInterfaceEndpointHandle handle) {
-    fake_driver_.BindRequest(
-        mojom::PasswordManagerDriverAssociatedRequest(std::move(handle)));
-  }
-
-  void BindPasswordManagerClient(mojo::ScopedInterfaceEndpointHandle handle) {
-    fake_pw_client_.BindRequest(
-        mojom::PasswordGenerationDriverAssociatedRequest(std::move(handle)));
-  }
+  void BindPasswordManagerDriver(mojo::ScopedInterfaceEndpointHandle handle);
+  void BindPasswordManagerClient(mojo::ScopedInterfaceEndpointHandle handle);
 
   // Callback for UserTriggeredGeneratePassword.
   MOCK_METHOD1(UserTriggeredGeneratePasswordReply,
@@ -344,6 +238,167 @@
   DISALLOW_COPY_AND_ASSIGN(PasswordGenerationAgentTest);
 };
 
+void PasswordGenerationAgentTest::RegisterMainFrameRemoteInterfaces() {
+  // Because the test cases only involve the main frame in this test,
+  // the fake password client is only used for the main frame.
+  blink::AssociatedInterfaceProvider* remote_associated_interfaces =
+      view_->GetMainRenderFrame()->GetRemoteAssociatedInterfaces();
+  remote_associated_interfaces->OverrideBinderForTesting(
+      mojom::PasswordGenerationDriver::Name_,
+      base::BindRepeating(
+          &PasswordGenerationAgentTest::BindPasswordManagerClient,
+          base::Unretained(this)));
+  remote_associated_interfaces->OverrideBinderForTesting(
+      mojom::PasswordManagerDriver::Name_,
+      base::BindRepeating(
+          &PasswordGenerationAgentTest::BindPasswordManagerDriver,
+          base::Unretained(this)));
+}
+
+void PasswordGenerationAgentTest::SetUp() {
+  ChromeRenderViewTest::SetUp();
+
+  // TODO(crbug/862989): Remove workaround preventing non-test classes to bind
+  // fake_driver_ or fake_pw_client_.
+  password_autofill_agent_->GetPasswordManagerDriver();
+  password_generation_->RequestPasswordManagerClientForTesting();
+  base::RunLoop().RunUntilIdle();  // Executes binding the interfaces.
+  // Reject all requests to bind driver/client to anything but the test class:
+  view_->GetMainRenderFrame()
+      ->GetRemoteAssociatedInterfaces()
+      ->OverrideBinderForTesting(
+          mojom::PasswordGenerationDriver::Name_,
+          base::BindRepeating([](mojo::ScopedInterfaceEndpointHandle handle) {
+            handle.reset();
+          }));
+  view_->GetMainRenderFrame()
+      ->GetRemoteAssociatedInterfaces()
+      ->OverrideBinderForTesting(
+          mojom::PasswordManagerDriver::Name_,
+          base::BindRepeating([](mojo::ScopedInterfaceEndpointHandle handle) {
+            handle.reset();
+          }));
+
+  // Necessary for focus changes to work correctly and dispatch blur events
+  // when a field was previously focused.
+  GetWebWidget()->SetFocus(true);
+}
+
+void PasswordGenerationAgentTest::TearDown() {
+  // Unloading the document may trigger the event.
+  EXPECT_CALL(fake_pw_client_, AutomaticGenerationStatusChanged(false, _))
+      .Times(AtMost(1));
+  ChromeRenderViewTest::TearDown();
+}
+
+void PasswordGenerationAgentTest::LoadHTMLWithUserGesture(const char* html) {
+  LoadHTML(html);
+
+  // Enable show-ime event when element is focused by indicating that a user
+  // gesture has been processed since load.
+  EXPECT_TRUE(SimulateElementClick("dummy"));
+}
+
+void PasswordGenerationAgentTest::FocusField(const char* element_id) {
+  WebDocument document = GetMainFrame()->GetDocument();
+  blink::WebElement element =
+      document.GetElementById(blink::WebString::FromUTF8(element_id));
+  ASSERT_FALSE(element.IsNull());
+  ExecuteJavaScriptForTests(
+      base::StringPrintf("document.getElementById('%s').focus();", element_id)
+          .c_str());
+}
+
+void PasswordGenerationAgentTest::ExpectAutomaticGenerationAvailable(
+    const char* element_id,
+    AutomaticGenerationStatus available) {
+  SCOPED_TRACE(testing::Message()
+               << "element_id = " << element_id << "available = " << available);
+  if (available == kNotReported) {
+    EXPECT_CALL(fake_pw_client_, AutomaticGenerationStatusChanged(_, _))
+        .Times(0);
+  } else {
+    EXPECT_CALL(fake_pw_client_,
+                AutomaticGenerationStatusChanged(available == kAvailable, _));
+  }
+  FocusField(element_id);
+  base::RunLoop().RunUntilIdle();
+  testing::Mock::VerifyAndClearExpectations(&fake_pw_client_);
+
+  // Check that aria-autocomplete attribute is set correctly.
+  if (available == kAvailable) {
+    WebDocument doc = GetMainFrame()->GetDocument();
+    WebElement element = doc.GetElementById(WebString::FromUTF8(element_id));
+    EXPECT_EQ("list", element.GetAttribute("aria-autocomplete"));
+  }
+}
+
+void PasswordGenerationAgentTest::ExpectFormClassifierVoteReceived(
+    bool received,
+    const base::string16& expected_generation_element) {
+  base::RunLoop().RunUntilIdle();
+  if (received) {
+    ASSERT_TRUE(fake_driver_.called_save_generation_field());
+    EXPECT_EQ(expected_generation_element,
+              fake_driver_.save_generation_field());
+  } else {
+    ASSERT_FALSE(fake_driver_.called_save_generation_field());
+  }
+
+  fake_driver_.reset_save_generation_field();
+}
+
+void PasswordGenerationAgentTest::SelectGenerationFallbackAndExpect(
+    bool available) {
+  if (available) {
+    EXPECT_CALL(*this,
+                UserTriggeredGeneratePasswordReply(testing::Ne(base::nullopt)));
+  } else {
+    EXPECT_CALL(*this,
+                UserTriggeredGeneratePasswordReply(testing::Eq(base::nullopt)));
+  }
+  password_generation_->UserTriggeredGeneratePassword(base::BindOnce(
+      &PasswordGenerationAgentTest::UserTriggeredGeneratePasswordReply,
+      base::Unretained(this)));
+  testing::Mock::VerifyAndClearExpectations(this);
+}
+
+void PasswordGenerationAgentTest::SetAccountCreationFormsDetectedMessage(
+    GenerationAvailableForFormStatus status,
+    int form_index,
+    int field_index) {
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_))
+      .Times(status == GenerationAvailableForFormStatus::kAvailable);
+  ::autofill::SetAccountCreationFormsDetectedMessage(
+      password_generation_, GetMainFrame()->GetDocument(), form_index,
+      field_index);
+  fake_pw_client_.Flush();
+  testing::Mock::VerifyAndClearExpectations(&fake_pw_client_);
+}
+
+void PasswordGenerationAgentTest::
+    SetAccountCreationFormsDetectedMessageForUnownedInputs(
+        GenerationAvailableForFormStatus status) {
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_))
+      .Times(status == GenerationAvailableForFormStatus::kAvailable);
+  ::autofill::SetAccountCreationFormsDetectedMessageForUnownedInputs(
+      password_generation_, GetMainFrame()->GetDocument());
+  fake_pw_client_.Flush();
+  testing::Mock::VerifyAndClearExpectations(&fake_pw_client_);
+}
+
+void PasswordGenerationAgentTest::BindPasswordManagerDriver(
+    mojo::ScopedInterfaceEndpointHandle handle) {
+  fake_driver_.BindRequest(
+      mojom::PasswordManagerDriverAssociatedRequest(std::move(handle)));
+}
+
+void PasswordGenerationAgentTest::BindPasswordManagerClient(
+    mojo::ScopedInterfaceEndpointHandle handle) {
+  fake_pw_client_.BindRequest(
+      mojom::PasswordGenerationDriverAssociatedRequest(std::move(handle)));
+}
+
 class PasswordGenerationAgentTestForHtmlAnnotation
     : public PasswordGenerationAgentTest {
  public:
@@ -369,11 +424,11 @@
   LoadHTMLWithUserGesture(kHtmlForm);
   SetNotBlacklistedMessage(password_generation_, kHtmlForm);
   if (has_form_tag) {
-    SetAccountCreationFormsDetectedMessage(password_generation_,
-                                           GetMainFrame()->GetDocument(), 0, 1);
+    SetAccountCreationFormsDetectedMessage(
+        GenerationAvailableForFormStatus::kAvailable);
   } else {
     SetAccountCreationFormsDetectedMessageForUnownedInputs(
-        password_generation_, GetMainFrame()->GetDocument());
+        GenerationAvailableForFormStatus::kAvailable);
   }
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
   WebDocument document = GetMainFrame()->GetDocument();
@@ -450,8 +505,8 @@
   LoadHTMLWithUserGesture(kHiddenPasswordAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_,
                            kHiddenPasswordAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 }
 
@@ -460,8 +515,8 @@
   LoadHTMLWithUserGesture(kInvalidActionAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_,
                            kInvalidActionAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kUnavailable);
   ExpectAutomaticGenerationAvailable("first_password", kNotReported);
 }
 
@@ -469,7 +524,7 @@
   LoadHTMLWithUserGesture(kAccountCreationNoForm);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationNoForm);
   SetAccountCreationFormsDetectedMessageForUnownedInputs(
-      password_generation_, GetMainFrame()->GetDocument());
+      GenerationAvailableForFormStatus::kAvailable);
 
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
   ExpectAutomaticGenerationAvailable("second_password", kUnavailable);
@@ -490,7 +545,8 @@
   WebDocument document = GetMainFrame()->GetDocument();
   ASSERT_TRUE(document.FocusedElement().IsNull());
   SetNotBlacklistedMessage(password_generation_, html.c_str());
-  SetAccountCreationFormsDetectedMessage(password_generation_, document, 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   WebElement element =
       document.GetElementById(WebString::FromUTF8("first_password"));
@@ -534,8 +590,8 @@
 TEST_F(PasswordGenerationAgentTest, EditingTest) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   WebDocument document = GetMainFrame()->GetDocument();
   WebElement element =
@@ -584,8 +640,8 @@
 TEST_F(PasswordGenerationAgentTest, EditingEventsTest) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   // Generate password.
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
@@ -634,8 +690,8 @@
   // Did not receive not blacklisted message. Don't show password generation
   // icon.
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kUnavailable);
   ExpectAutomaticGenerationAvailable("first_password", kNotReported);
 }
 
@@ -644,8 +700,8 @@
   // show password generation icon.
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kSigninFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kUnavailable);
   ExpectAutomaticGenerationAvailable("first_password", kNotReported);
 }
 
@@ -654,8 +710,8 @@
   // password generation icon.
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 }
 
@@ -665,8 +721,8 @@
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kSigninFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 }
 
@@ -680,8 +736,8 @@
   // generation icon.
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 }
 
@@ -690,8 +746,8 @@
 
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   // There should now be a message to show the UI.
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 
@@ -712,14 +768,11 @@
                   'a'));
   testing::Mock::VerifyAndClearExpectations(&fake_pw_client_);
 
-  fake_pw_client_.reset_called_password_generation_rejected_by_typing();
-
   // Simulate a user typing a password just over maximum offer size.
+  EXPECT_CALL(fake_pw_client_, PasswordGenerationRejectedByTyping());
   SimulateUserTypingASCIICharacter('a', true);
   // There should now be a message that generation was rejected.
   fake_pw_client_.Flush();
-  EXPECT_TRUE(fake_pw_client_.called_password_generation_rejected_by_typing());
-  fake_pw_client_.reset_called_password_generation_rejected_by_typing();
 
   // Simulate the user deleting characters. The generation popup should be
   // shown again.
@@ -753,8 +806,8 @@
 TEST_F(PasswordGenerationAgentTest, MinimumLengthForEditedPassword) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   // Generate a new password.
   base::string16 password = base::ASCIIToUTF16("random_password");
@@ -825,8 +878,8 @@
   WaitForAutofillDidAssociateFormControl();
 
   // This needs to come after the DOM has been modified.
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 1, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable, 1, 1);
 
   // TODO(gcasto): I'm slightly worried about flakes in this test where
   // didAssociateFormControls() isn't called. If this turns out to be a problem
@@ -843,8 +896,8 @@
                            kMultipleAccountCreationFormHTML);
 
   // Should trigger on the second form.
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 1, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable, 1, 1);
 
   ExpectAutomaticGenerationAvailable("password", kNotReported);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
@@ -853,8 +906,8 @@
 TEST_F(PasswordGenerationAgentTest, MessagesAfterAccountSignupFormFound) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   // Generation should be enabled.
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
@@ -873,26 +926,25 @@
   LoadHTMLWithUserGesture(kDisabledElementAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_,
                            kDisabledElementAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   // Focus on the first password field: password generation popup should show
   // up.
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 
-  fake_pw_client_.reset_called_generation_available_for_form();
   // Remove focus from everywhere by clicking an unfocusable element: password
   // generation popup should not show up.
   EXPECT_CALL(fake_pw_client_, AutomaticGenerationStatusChanged(false, _));
   EXPECT_TRUE(SimulateElementClick("disabled"));
   fake_pw_client_.Flush();
-  EXPECT_FALSE(fake_pw_client_.called_generation_available_for_form());
 }
 
 TEST_F(PasswordGenerationAgentTest, BothAutocompleteAttributesTest) {
   // Verify that autocomplete attributes can override Autofill to enable
   // generation.
   LoadHTMLWithUserGesture(kBothAutocompleteAttributesFormHTML);
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_));
   SetNotBlacklistedMessage(password_generation_,
                            kBothAutocompleteAttributesFormHTML);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
@@ -909,6 +961,7 @@
 TEST_F(PasswordGenerationAgentTest, NewPasswordAutocompleteAttributesTest) {
   // Only new-password autocomplete attribute enabled does trigger generation.
   LoadHTMLWithUserGesture(kNewPasswordAutocompleteAttributeFormHTML);
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_));
   SetNotBlacklistedMessage(password_generation_,
                            kNewPasswordAutocompleteAttributeFormHTML);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
@@ -918,6 +971,7 @@
        CurrentAndNewPasswordAutocompleteAttributesTest) {
   // Generation is triggered if the form has only password fields.
   LoadHTMLWithUserGesture(kCurrentAndNewPasswordAutocompleteAttributeFormHTML);
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_));
   SetNotBlacklistedMessage(password_generation_,
                            kCurrentAndNewPasswordAutocompleteAttributeFormHTML);
   ExpectAutomaticGenerationAvailable("old_password", kNotReported);
@@ -933,8 +987,8 @@
   ExpectAutomaticGenerationAvailable("newpassword", kNotReported);
   ExpectAutomaticGenerationAvailable("confirmpassword", kNotReported);
 
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 2);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable, 0, 2);
   ExpectAutomaticGenerationAvailable("password", kNotReported);
   ExpectAutomaticGenerationAvailable("newpassword", kAvailable);
   ExpectAutomaticGenerationAvailable("confirmpassword", kUnavailable);
@@ -958,8 +1012,8 @@
 TEST_F(PasswordGenerationAgentTest, ManualGenerationDoesntSuppressAutomatic) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
   // The browser may show a standard password dropdown with the "Generate"
   // option. In this case manual generation is triggered.
@@ -1109,6 +1163,7 @@
   generation_data.confirmation_field_signature.emplace(
       CalculateFieldSignatureForField(form_data.fields[3]));
   forms.push_back(generation_data);
+  EXPECT_CALL(fake_pw_client_, GenerationAvailableForForm(_));
   password_generation_->FoundFormsEligibleForGeneration(forms);
 
   WebElement element =
@@ -1141,8 +1196,8 @@
   // Test cases: user click on another input field and on non-focusable element.
   LoadHTMLWithUserGesture(kPasswordFormAndSpanHTML);
   SetNotBlacklistedMessage(password_generation_, kPasswordFormAndSpanHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   const char* kGenerationElementId = "password";
   const char* kSpanId = "span";
   const char* kTextFieldId = "username";
@@ -1154,8 +1209,7 @@
                   &autofill::PasswordForm::password_value, password)));
   password_generation_->GeneratedPasswordAccepted(password);
 
-  const bool kFalseTrue[] = {false, true};
-  for (bool clickOnInputField : kFalseTrue) {
+  for (bool clickOnInputField : {false, true}) {
     SCOPED_TRACE(testing::Message("clickOnInputField = ") << clickOnInputField);
     // Click on the generation field to reveal the password value.
     EXPECT_CALL(fake_pw_client_, ShowPasswordEditingPopup(_, _));
@@ -1180,8 +1234,8 @@
 TEST_F(PasswordGenerationAgentTest, JavascriptClearedTheField) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   const char kGenerationElementId[] = "first_password";
   ExpectAutomaticGenerationAvailable(kGenerationElementId, kAvailable);
@@ -1222,8 +1276,8 @@
 TEST_F(PasswordGenerationAgentTest, AutofillToGenerationField) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
   ExpectAutomaticGenerationAvailable("first_password", kAvailable);
 
   WebDocument document = GetMainFrame()->GetDocument();
@@ -1248,8 +1302,8 @@
 TEST_F(PasswordGenerationAgentTest, PasswordUnmaskedUntilCompleteDeletion) {
   LoadHTMLWithUserGesture(kAccountCreationFormHTML);
   SetNotBlacklistedMessage(password_generation_, kAccountCreationFormHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   constexpr char kGenerationElementId[] = "first_password";
 
@@ -1302,8 +1356,8 @@
 TEST_F(PasswordGenerationAgentTest, ShortPasswordMaskedAfterChangingFocus) {
   LoadHTMLWithUserGesture(kPasswordFormAndSpanHTML);
   SetNotBlacklistedMessage(password_generation_, kPasswordFormAndSpanHTML);
-  SetAccountCreationFormsDetectedMessage(password_generation_,
-                                         GetMainFrame()->GetDocument(), 0, 1);
+  SetAccountCreationFormsDetectedMessage(
+      GenerationAvailableForFormStatus::kAvailable);
 
   constexpr char kGenerationElementId[] = "password";
 
diff --git a/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.html b/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.html
deleted file mode 100644
index 124cfd75..0000000
--- a/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.html
+++ /dev/null
@@ -1,9 +0,0 @@
-<!--
- * 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.
--->
-<body>
-<script src="framework.js"></script>
-<script src="test_websocket_clean_close.js"></script>
-</body>
diff --git a/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.js b/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.js
deleted file mode 100644
index a7648cf..0000000
--- a/chrome/test/data/extensions/api_test/webrequest/test_websocket_clean_close.js
+++ /dev/null
@@ -1,35 +0,0 @@
-// 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.
-
-// Opens a WebSocket, busy waits for 100ms, sends a message. Verifies that the
-// close was clean. If it fails, it will fail flakily, so repeat it 10 times to
-// get a deterministic answer.
-function sendDoesntError(iteration = 0, done = undefined) {
-  let ws = new WebSocket('ws://localhost:' + testWebSocketPort +
-                         '/close-immediately');
-
-  if (!done)
-    done = chrome.test.callbackAdded();
-
-  ws.onclose = event => {
-    chrome.test.log('WebSocket ' + iteration + ' closed ' +
-                    (event.wasClean ? 'cleanly.' : 'uncleanly.'));
-    chrome.test.assertTrue(event.wasClean);
-    if (iteration < 10) {
-      ++iteration;
-      sendDoesntError(iteration, done);
-    } else {
-      done();
-    }
-  }
-
-  ws.onopen = () => {
-    chrome.test.log('WebSocket ' + iteration + ' opened.');
-    const start = performance.now();
-    while (performance.now() - start < 100) {}
-    ws.send('message');
-  };
-}
-
-chrome.tabs.getCurrent(tab => runTestsForTab([sendDoesntError], tab));
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index f45c4a71..ba87194d 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3862,11 +3862,11 @@
     ]
   },
 
-  "DeviceLoginScreenAppInstallList": {
+  "DeviceLoginScreenExtensions": {
     "os": ["chromeos"],
-    "test_policy": { "DeviceLoginScreenAppInstallList": [ "abcdefghijklmnopabcdefghijklmnop" ] },
+    "test_policy": { "DeviceLoginScreenExtensions": [ "abcdefghijklmnopabcdefghijklmnop" ] },
     "pref_mappings": [
-      { "pref": "cros.device.login_screen_app_install_list" }
+      { "pref": "cros.device.login_screen_extensions" }
     ]
   },
 
diff --git a/chromeos/constants/chromeos_switches.cc b/chromeos/constants/chromeos_switches.cc
index fadaa51..d0b14970 100644
--- a/chromeos/constants/chromeos_switches.cc
+++ b/chromeos/constants/chromeos_switches.cc
@@ -500,6 +500,10 @@
 // The rlz ping delay (in seconds) that overwrites the default value.
 const char kRlzPingDelay[] = "rlz-ping-delay";
 
+// Password change url for SAML users. Remove when https://crbug.com/941489 is
+// fixed.
+const char kSamlPasswordChangeUrl[] = "saml-password-change-url";
+
 // App window previews when hovering over the shelf.
 const char kShelfHoverPreviews[] = "shelf-hover-previews";
 
diff --git a/chromeos/constants/chromeos_switches.h b/chromeos/constants/chromeos_switches.h
index f1e6f658..934a0a79 100644
--- a/chromeos/constants/chromeos_switches.h
+++ b/chromeos/constants/chromeos_switches.h
@@ -194,6 +194,7 @@
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kProfileRequiresPolicy[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kRegulatoryLabelDir[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kRlzPingDelay[];
+COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kSamlPasswordChangeUrl[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS) extern const char kShelfHoverPreviews[];
 COMPONENT_EXPORT(CHROMEOS_CONSTANTS)
 extern const char kShowAndroidFilesInFilesApp[];
diff --git a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
index 102eae7f..587fcafb 100644
--- a/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
+++ b/chromeos/dbus/cryptohome/fake_cryptohome_client.cc
@@ -606,7 +606,21 @@
 void FakeCryptohomeClient::LockToSingleUserMountUntilReboot(
     const cryptohome::LockToSingleUserMountUntilRebootRequest& request,
     DBusMethodCallback<cryptohome::BaseReply> callback) {
-  ReturnProtobufMethodCallback(cryptohome::BaseReply(), std::move(callback));
+  cryptohome::BaseReply reply;
+  cryptohome::LockToSingleUserMountUntilRebootReply* mutable_reply =
+      reply.MutableExtension(
+          cryptohome::LockToSingleUserMountUntilRebootReply::reply);
+  if (cryptohome_error_ == cryptohome::CRYPTOHOME_ERROR_NOT_SET) {
+    mutable_reply->set_result(
+        cryptohome::LockToSingleUserMountUntilRebootResult::SUCCESS);
+    is_device_locked_to_single_user_ = true;
+  } else {
+    mutable_reply->set_result(
+        cryptohome::LockToSingleUserMountUntilRebootResult::
+            FAILED_TO_EXTEND_PCR);
+  }
+
+  ReturnProtobufMethodCallback(reply, std::move(callback));
 }
 
 void FakeCryptohomeClient::AddKeyEx(
diff --git a/chromeos/dbus/cryptohome/fake_cryptohome_client.h b/chromeos/dbus/cryptohome/fake_cryptohome_client.h
index c70b639..982127e 100644
--- a/chromeos/dbus/cryptohome/fake_cryptohome_client.h
+++ b/chromeos/dbus/cryptohome/fake_cryptohome_client.h
@@ -335,6 +335,10 @@
     return remove_firmware_management_parameters_from_tpm_call_count_;
   }
 
+  bool is_device_locked_to_single_user() const {
+    return is_device_locked_to_single_user_;
+  }
+
  private:
   void ReturnProtobufMethodCallback(
       const cryptohome::BaseReply& reply,
@@ -430,6 +434,9 @@
   cryptohome::AccountIdentifier id_for_disk_migrated_to_dircrypto_;
   cryptohome::MigrateToDircryptoRequest last_migrate_to_dircrypto_request_;
 
+  // Used by LockToSingleUserMountUntilReboot.
+  bool is_device_locked_to_single_user_ = false;
+
   base::WeakPtrFactory<FakeCryptohomeClient> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(FakeCryptohomeClient);
diff --git a/chromeos/login/auth/cryptohome_authenticator.cc b/chromeos/login/auth/cryptohome_authenticator.cc
index 9af5958..f5b563ae 100644
--- a/chromeos/login/auth/cryptohome_authenticator.cc
+++ b/chromeos/login/auth/cryptohome_authenticator.cc
@@ -816,6 +816,15 @@
     consumer_->OnAuthFailure(error);
 }
 
+void CryptohomeAuthenticator::MigrateKey(const UserContext& user_context,
+                                         const std::string& old_password) {
+  current_state_.reset(new AuthAttemptState(user_context,
+                                            false,  // unlock
+                                            false,  // online_complete
+                                            !IsKnownUser(user_context)));
+  RecoverEncryptedData(old_password);
+}
+
 void CryptohomeAuthenticator::RecoverEncryptedData(
     const std::string& old_password) {
   migrate_attempted_ = true;
diff --git a/chromeos/login/auth/cryptohome_authenticator.h b/chromeos/login/auth/cryptohome_authenticator.h
index 9e60485a..614a9c958 100644
--- a/chromeos/login/auth/cryptohome_authenticator.h
+++ b/chromeos/login/auth/cryptohome_authenticator.h
@@ -178,6 +178,10 @@
   void OnPasswordChangeDetected();
   void OnOldEncryptionDetected(bool has_incomplete_migration);
 
+  // Migrate cryptohome key for |user_context| using |old_password|.
+  void MigrateKey(const UserContext& user_context,
+                  const std::string& old_password);
+
  protected:
   ~CryptohomeAuthenticator() override;
 
diff --git a/chromeos/settings/cros_settings_names.cc b/chromeos/settings/cros_settings_names.cc
index 8dff5c6..e82e51a 100644
--- a/chromeos/settings/cros_settings_names.cc
+++ b/chromeos/settings/cros_settings_names.cc
@@ -266,11 +266,11 @@
 const char kLoginVideoCaptureAllowedUrls[] =
     "cros.device.login_video_capture_allowed_urls";
 
-// A list pref storing the apps to install on the login page. It is a list of
-// strings, each string contains an extension ID and an update URL, delimited by
-// a semicolon. This preference is set by an admin policy.
-const char kDeviceLoginScreenAppInstallList[] =
-    "cros.device.login_screen_app_install_list";
+// A list pref storing the apps or extensions to install on the login page. It
+// is a list of strings, each string contains an extension ID and an update URL,
+// delimited by a semicolon. This preference is set by an admin policy.
+const char kDeviceLoginScreenExtensions[] =
+    "cros.device.login_screen_extensions";
 
 // A list pref specifying the locales allowed on the login screen. Currently
 // only the first value is used, as the single locale allowed on the login
diff --git a/chromeos/settings/cros_settings_names.h b/chromeos/settings/cros_settings_names.h
index 9cc2c42..313c637 100644
--- a/chromeos/settings/cros_settings_names.h
+++ b/chromeos/settings/cros_settings_names.h
@@ -164,7 +164,7 @@
 extern const char kLoginVideoCaptureAllowedUrls[];
 
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
-extern const char kDeviceLoginScreenAppInstallList[];
+extern const char kDeviceLoginScreenExtensions[];
 
 COMPONENT_EXPORT(CHROMEOS_SETTINGS)
 extern const char kDeviceLoginScreenLocales[];
diff --git a/components/arc/common/input_method_manager.mojom b/components/arc/common/input_method_manager.mojom
index b3d89bb..29fb9ba 100644
--- a/components/arc/common/input_method_manager.mojom
+++ b/components/arc/common/input_method_manager.mojom
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// Next MinVersion: 7
+// Next MinVersion: 8
 
 module arc.mojom;
 
@@ -57,11 +57,25 @@
   [MinVersion=6] Range? composition_text_range;
 };
 
+// Represents the information of a key event.
+[MinVersion=7]
+struct KeyEventData {
+  // Whether the event is a press event or a release event.
+  bool pressed;
+  // The key touched in the event represented in |ui::KeyboardCode|.
+  int32 key_code;
+  // The flags for modifiers state.
+  bool is_shift_down;
+  bool is_control_down;
+  bool is_alt_down;
+  bool is_capslock_on;
+};
+
 // This interface provides methods to control a text field.
 // It is generated for each focused text field and passed to Android.
 // This interface will be closed when the focus moves to another text field.
 //
-// Next method ID: 6
+// Next method ID: 7
 [MinVersion=2]
 interface InputConnection {
   // Commits text to the focused text field and set the new cursor position.
@@ -87,6 +101,9 @@
 
   // Selects the given UTF-16 based character range.
   [MinVersion=5] SetSelection@5(Range new_selection_range);
+
+  // Sends a key event.
+  [MinVersion=7] SendKeyEvent@6(KeyEventData key_event_data);
 };
 
 // This interface is called by container when Android's InputMethodManager state
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
index 8022c6a..c5853c0 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.cc
@@ -94,6 +94,12 @@
 AutofillProfileSyncableService::AutofillProfileSyncableService()
     : webdata_backend_(nullptr), scoped_observer_(this) {}
 
+void AutofillProfileSyncableService::WaitUntilReadyToSync(
+    base::OnceClosure done) {
+  // Not used in the legacy directory-based architecture.
+  NOTREACHED();
+}
+
 syncer::SyncMergeResult
 AutofillProfileSyncableService::MergeDataAndStartSyncing(
     syncer::ModelType type,
diff --git a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.h b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.h
index 079ff91..d963810 100644
--- a/components/autofill/core/browser/webdata/autofill_profile_syncable_service.h
+++ b/components/autofill/core/browser/webdata/autofill_profile_syncable_service.h
@@ -70,6 +70,7 @@
   static syncer::ModelType model_type() { return syncer::AUTOFILL_PROFILE; }
 
   // syncer::SyncableService implementation.
+  void WaitUntilReadyToSync(base::OnceClosure done) override;
   syncer::SyncMergeResult MergeDataAndStartSyncing(
       syncer::ModelType type,
       const syncer::SyncDataList& initial_sync_data,
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.cc b/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.cc
index df3a251..b176783f 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.cc
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.cc
@@ -7,6 +7,7 @@
 #include <stddef.h>
 
 #include <utility>
+#include <vector>
 
 #include "base/base64.h"
 #include "base/bind.h"
@@ -364,6 +365,12 @@
   }
 }
 
+void AutofillWalletMetadataSyncableService::WaitUntilReadyToSync(
+    base::OnceClosure done) {
+  // Not used in the legacy directory-based architecture.
+  NOTREACHED();
+}
+
 syncer::SyncMergeResult
 AutofillWalletMetadataSyncableService::MergeDataAndStartSyncing(
     syncer::ModelType type,
diff --git a/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h b/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h
index 0169b0de..6afaebd 100644
--- a/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h
+++ b/components/autofill/core/browser/webdata/autofill_wallet_metadata_syncable_service.h
@@ -64,6 +64,7 @@
   }
 
   // syncer::SyncableService implementation.
+  void WaitUntilReadyToSync(base::OnceClosure done) override;
   syncer::SyncMergeResult MergeDataAndStartSyncing(
       syncer::ModelType type,
       const syncer::SyncDataList& initial_sync_data,
diff --git a/components/autofill_assistant/browser/BUILD.gn b/components/autofill_assistant/browser/BUILD.gn
index 3ecd466..dd88e9f 100644
--- a/components/autofill_assistant/browser/BUILD.gn
+++ b/components/autofill_assistant/browser/BUILD.gn
@@ -78,6 +78,8 @@
     "client.h",
     "client_memory.cc",
     "client_memory.h",
+    "client_status.cc",
+    "client_status.h",
     "controller.cc",
     "controller.h",
     "details.cc",
diff --git a/components/autofill_assistant/browser/actions/action.cc b/components/autofill_assistant/browser/actions/action.cc
index 30f4a5f..67dcd0f 100644
--- a/components/autofill_assistant/browser/actions/action.cc
+++ b/components/autofill_assistant/browser/actions/action.cc
@@ -20,10 +20,14 @@
   InternalProcessAction(delegate, std::move(callback));
 }
 
-void Action::UpdateProcessedAction(ProcessedActionStatusProto status) {
+void Action::UpdateProcessedAction(ProcessedActionStatusProto status_proto) {
+  UpdateProcessedAction(ClientStatus(status_proto));
+}
+
+void Action::UpdateProcessedAction(const ClientStatus& status) {
   // Safety check in case process action is run twice.
   *processed_action_proto_->mutable_action() = proto_;
-  processed_action_proto_->set_status(status);
+  status.FillProto(processed_action_proto_.get());
 }
 
 // static
diff --git a/components/autofill_assistant/browser/actions/action.h b/components/autofill_assistant/browser/actions/action.h
index fda288a..08bf226 100644
--- a/components/autofill_assistant/browser/actions/action.h
+++ b/components/autofill_assistant/browser/actions/action.h
@@ -17,6 +17,7 @@
 namespace autofill_assistant {
 
 class ActionDelegate;
+class ClientStatus;
 
 // An action that performs a single step of a script on the website.
 class Action {
@@ -45,6 +46,7 @@
       const google::protobuf::RepeatedPtrField<std::string>& repeated_strings);
 
   void UpdateProcessedAction(ProcessedActionStatusProto status);
+  void UpdateProcessedAction(const ClientStatus& status);
 
   // Intended for debugging. Writes a string representation of |action| to
   // |out|.
diff --git a/components/autofill_assistant/browser/actions/action_delegate.h b/components/autofill_assistant/browser/actions/action_delegate.h
index db092d8..2270859 100644
--- a/components/autofill_assistant/browser/actions/action_delegate.h
+++ b/components/autofill_assistant/browser/actions/action_delegate.h
@@ -31,6 +31,7 @@
 
 namespace autofill_assistant {
 class ClientMemory;
+class ClientStatus;
 
 // Action delegate called when processing actions.
 class ActionDelegate {
@@ -58,9 +59,9 @@
   //
   // TODO(crbug.com/806868): Consider embedding that wait right into
   // WebController and eliminate double-lookup.
-  virtual void ShortWaitForElementExist(
-      const Selector& selector,
-      base::OnceCallback<void(bool)> callback) = 0;
+  virtual void ShortWaitForElement(ElementCheckType check_type,
+                                   const Selector& selector,
+                                   base::OnceCallback<void(bool)> callback) = 0;
 
   // Wait for up to |max_wait_time| for the element |selectors| to be visible on
   // the page, then call |callback| with true if the element was visible, false
@@ -74,8 +75,9 @@
       base::OnceCallback<void(ProcessedActionStatusProto)> callback) = 0;
 
   // Click or tap the element given by |selector| on the web page.
-  virtual void ClickOrTapElement(const Selector& selector,
-                                 base::OnceCallback<void(bool)> callback) = 0;
+  virtual void ClickOrTapElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Ask user to select one of the given suggestions.
   //
@@ -108,26 +110,30 @@
 
   // Fill the address form given by |selector| with the given address
   // |profile|. |profile| cannot be nullptr.
-  virtual void FillAddressForm(const autofill::AutofillProfile* profile,
-                               const Selector& selector,
-                               base::OnceCallback<void(bool)> callback) = 0;
+  virtual void FillAddressForm(
+      const autofill::AutofillProfile* profile,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Fill the card form given by |selector| with the given |card| and its
   // |cvc|. Return result asynchronously through |callback|.
-  virtual void FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                            const base::string16& cvc,
-                            const Selector& selector,
-                            base::OnceCallback<void(bool)> callback) = 0;
+  virtual void FillCardForm(
+      std::unique_ptr<autofill::CreditCard> card,
+      const base::string16& cvc,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Select the option given by |selector| and the value of the option to be
   // picked.
-  virtual void SelectOption(const Selector& selector,
-                            const std::string& selected_option,
-                            base::OnceCallback<void(bool)> callback) = 0;
+  virtual void SelectOption(
+      const Selector& selector,
+      const std::string& selected_option,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Focus on the element given by |selector|.
-  virtual void FocusElement(const Selector& selector,
-                            base::OnceCallback<void(bool)> callback) = 0;
+  virtual void FocusElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Sets selector of areas that can be manipulated:
   // - after the end of the script and before the beginning of the next script.
@@ -137,34 +143,39 @@
       const ElementAreaProto& touchable_element_area) = 0;
 
   // Highlight the element given by |selector|.
-  virtual void HighlightElement(const Selector& selector,
-                                base::OnceCallback<void(bool)> callback) = 0;
+  virtual void HighlightElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Set the |value| of field |selector| and return the result through
   // |callback|. If |simulate_key_presses| is true, the value will be set by
   // clicking the field and then simulating key presses, otherwise the `value`
   // attribute will be set directly.
-  virtual void SetFieldValue(const Selector& selector,
-                             const std::string& value,
-                             bool simulate_key_presses,
-                             base::OnceCallback<void(bool)> callback) = 0;
+  virtual void SetFieldValue(
+      const Selector& selector,
+      const std::string& value,
+      bool simulate_key_presses,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Set the |value| of the |attribute| of the element given by |selector|.
-  virtual void SetAttribute(const Selector& selector,
-                            const std::vector<std::string>& attribute,
-                            const std::string& value,
-                            base::OnceCallback<void(bool)> callback) = 0;
+  virtual void SetAttribute(
+      const Selector& selector,
+      const std::vector<std::string>& attribute,
+      const std::string& value,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Sets the keyboard focus to |selector| and inputs the specified text parts.
   // Returns the result through |callback|.
-  virtual void SendKeyboardInput(const Selector& selector,
-                                 const std::vector<std::string>& text_parts,
-                                 base::OnceCallback<void(bool)> callback) = 0;
+  virtual void SendKeyboardInput(
+      const Selector& selector,
+      const std::vector<std::string>& text_parts,
+      base::OnceCallback<void(const ClientStatus&)> callback) = 0;
 
   // Return the outerHTML of an element given by |selector|.
   virtual void GetOuterHtml(
       const Selector& selector,
-      base::OnceCallback<void(bool, const std::string&)> callback) = 0;
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback) = 0;
 
   // Load |url| in the current tab. Returns immediately, before the new page has
   // been loaded.
diff --git a/components/autofill_assistant/browser/actions/autofill_action.cc b/components/autofill_assistant/browser/actions/autofill_action.cc
index 024cc13..1cafea7 100644
--- a/components/autofill_assistant/browser/actions/autofill_action.cc
+++ b/components/autofill_assistant/browser/actions/autofill_action.cc
@@ -16,6 +16,7 @@
 #include "components/autofill_assistant/browser/actions/action_delegate.h"
 #include "components/autofill_assistant/browser/batch_element_checker.h"
 #include "components/autofill_assistant/browser/client_memory.h"
+#include "components/autofill_assistant/browser/client_status.h"
 
 namespace autofill_assistant {
 
@@ -64,15 +65,20 @@
 }
 
 void AutofillAction::EndAction(ProcessedActionStatusProto status) {
+  EndAction(ClientStatus(status));
+}
+
+void AutofillAction::EndAction(const ClientStatus& status) {
   UpdateProcessedAction(status);
   std::move(process_action_callback_).Run(std::move(processed_action_proto_));
 }
 
 void AutofillAction::FillFormWithData(ActionDelegate* delegate) {
-  delegate->ShortWaitForElementExist(
-      selector_, base::BindOnce(&AutofillAction::OnWaitForElement,
-                                weak_ptr_factory_.GetWeakPtr(),
-                                base::Unretained(delegate)));
+  delegate->ShortWaitForElement(
+      kExistenceCheck, selector_,
+      base::BindOnce(&AutofillAction::OnWaitForElement,
+                     weak_ptr_factory_.GetWeakPtr(),
+                     base::Unretained(delegate)));
 }
 
 void AutofillAction::OnWaitForElement(ActionDelegate* delegate,
@@ -114,17 +120,16 @@
                                         weak_ptr_factory_.GetWeakPtr()));
 }
 
-void AutofillAction::OnCardFormFilled(bool successful) {
+void AutofillAction::OnCardFormFilled(const ClientStatus& status) {
   // TODO(crbug.com/806868): Implement required fields checking for cards.
-  EndAction(successful ? ACTION_APPLIED : OTHER_ACTION_STATUS);
-  return;
+  EndAction(status);
 }
 
 void AutofillAction::OnAddressFormFilled(ActionDelegate* delegate,
-                                         bool successful) {
+                                         const ClientStatus& status) {
   // In case Autofill failed, we fail the action.
-  if (!successful) {
-    EndAction(OTHER_ACTION_STATUS);
+  if (!status.ok()) {
+    EndAction(status);
     return;
   }
 
@@ -257,8 +262,8 @@
 
 void AutofillAction::OnSetFallbackFieldValue(ActionDelegate* delegate,
                                              int required_fields_index,
-                                             bool successful) {
-  if (!successful) {
+                                             const ClientStatus& status) {
+  if (!status.ok()) {
     // Fallback failed: we stop the script without checking the fields.
     EndAction(MANUAL_FALLBACK);
     return;
diff --git a/components/autofill_assistant/browser/actions/autofill_action.h b/components/autofill_assistant/browser/actions/autofill_action.h
index 8a25c07..09022089 100644
--- a/components/autofill_assistant/browser/actions/autofill_action.h
+++ b/components/autofill_assistant/browser/actions/autofill_action.h
@@ -21,6 +21,8 @@
 }  // namespace autofill
 
 namespace autofill_assistant {
+class ClientStatus;
+
 // An action to autofill a form using a local address or credit card.
 class AutofillAction : public Action {
  public:
@@ -35,6 +37,7 @@
                              ProcessActionCallback callback) override;
 
   void EndAction(ProcessedActionStatusProto status);
+  void EndAction(const ClientStatus& status);
 
   // Fill the form using data in client memory. Return whether filling succeeded
   // or not through OnAddressFormFilled or OnCardFormFilled.
@@ -47,10 +50,11 @@
                      const base::string16& cvc);
 
   // Called when the credit card form has been filled.
-  void OnCardFormFilled(bool successful);
+  void OnCardFormFilled(const ClientStatus& status);
 
   // Called when the address form has been filled.
-  void OnAddressFormFilled(ActionDelegate* delegate, bool successful);
+  void OnAddressFormFilled(ActionDelegate* delegate,
+                           const ClientStatus& status);
 
   // Check whether all required fields have a non-empty value. If it is the
   // case, finish the action successfully. If it's not and |allow_fallback|
@@ -86,7 +90,7 @@
   // after failed validation.
   void OnSetFallbackFieldValue(ActionDelegate* delegate,
                                int required_fields_index,
-                               bool successful);
+                               const ClientStatus& status);
 
   // Usage of the autofilled address. Ignored if autofilling a card.
   std::string name_;
diff --git a/components/autofill_assistant/browser/actions/autofill_action_unittest.cc b/components/autofill_assistant/browser/actions/autofill_action_unittest.cc
index 596b65f8..57452d4e 100644
--- a/components/autofill_assistant/browser/actions/autofill_action_unittest.cc
+++ b/components/autofill_assistant/browser/actions/autofill_action_unittest.cc
@@ -14,6 +14,7 @@
 #include "components/autofill/core/browser/personal_data_manager.h"
 #include "components/autofill_assistant/browser/actions/mock_action_delegate.h"
 #include "components/autofill_assistant/browser/client_memory.h"
+#include "components/autofill_assistant/browser/client_status.h"
 #include "components/autofill_assistant/browser/mock_run_once_callback.h"
 #include "components/autofill_assistant/browser/mock_web_controller.h"
 #include "components/autofill_assistant/browser/service.pb.h"
@@ -118,8 +119,8 @@
         .WillByDefault(Invoke([this]() {
           return std::make_unique<BatchElementChecker>(&mock_web_controller_);
         }));
-    ON_CALL(mock_action_delegate_, OnShortWaitForElementExist(_, _))
-        .WillByDefault(RunOnceCallback<1>(true));
+    ON_CALL(mock_action_delegate_, OnShortWaitForElement(_, _, _))
+        .WillByDefault(RunOnceCallback<2>(true));
   }
 
  protected:
@@ -209,7 +210,7 @@
   // Autofill succeeds.
   EXPECT_CALL(mock_action_delegate_,
               OnFillAddressForm(NotNull(), Eq(Selector({kFakeSelector})), _))
-      .WillOnce(RunOnceCallback<2>(true));
+      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
 
   // Validation succeeds.
   ON_CALL(mock_web_controller_, OnGetFieldValue(_, _))
@@ -233,7 +234,7 @@
   // Autofill succeeds.
   EXPECT_CALL(mock_action_delegate_,
               OnFillAddressForm(NotNull(), Eq(Selector({kFakeSelector})), _))
-      .WillOnce(RunOnceCallback<2>(true));
+      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
 
   // Validation fails when getting FIRST_NAME.
   EXPECT_CALL(mock_web_controller_,
@@ -249,7 +250,7 @@
   // Fallback fails.
   EXPECT_CALL(mock_action_delegate_,
               OnSetFieldValue(Eq(Selector({"#first_name"})), kFirstName, _))
-      .WillOnce(RunOnceCallback<2>(false));
+      .WillOnce(RunOnceCallback<2>(ClientStatus(OTHER_ACTION_STATUS)));
 
   EXPECT_EQ(ProcessedActionStatusProto::MANUAL_FALLBACK,
             ProcessAction(action_proto));
@@ -269,7 +270,7 @@
   // Autofill succeeds.
   EXPECT_CALL(mock_action_delegate_,
               OnFillAddressForm(NotNull(), Eq(Selector({kFakeSelector})), _))
-      .WillOnce(RunOnceCallback<2>(true));
+      .WillOnce(RunOnceCallback<2>(OkClientStatus()));
 
   {
     InSequence seq;
@@ -288,7 +289,7 @@
     // Fallback succeeds.
     EXPECT_CALL(mock_action_delegate_,
                 OnSetFieldValue(Eq(Selector({"#first_name"})), kFirstName, _))
-        .WillOnce(RunOnceCallback<2>(true));
+        .WillOnce(RunOnceCallback<2>(OkClientStatus()));
 
     // Second validation succeeds.
     EXPECT_CALL(mock_web_controller_, OnGetFieldValue(_, _))
diff --git a/components/autofill_assistant/browser/actions/click_action.cc b/components/autofill_assistant/browser/actions/click_action.cc
index 3f0bcef..8cca8b8 100644
--- a/components/autofill_assistant/browser/actions/click_action.cc
+++ b/components/autofill_assistant/browser/actions/click_action.cc
@@ -22,8 +22,8 @@
 void ClickAction::InternalProcessAction(ActionDelegate* delegate,
                                         ProcessActionCallback callback) {
   DCHECK_GT(proto_.click().element_to_click().selectors_size(), 0);
-  delegate->ShortWaitForElementExist(
-      Selector(proto_.click().element_to_click()),
+  delegate->ShortWaitForElement(
+      kVisibilityCheck, Selector(proto_.click().element_to_click()),
       base::BindOnce(&ClickAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -44,8 +44,9 @@
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback)));
 }
 
-void ClickAction::OnClick(ProcessActionCallback callback, bool status) {
-  UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+void ClickAction::OnClick(ProcessActionCallback callback,
+                          const ClientStatus& status) {
+  UpdateProcessedAction(status);
   std::move(callback).Run(std::move(processed_action_proto_));
 }
 
diff --git a/components/autofill_assistant/browser/actions/click_action.h b/components/autofill_assistant/browser/actions/click_action.h
index 458a1dc..3178042 100644
--- a/components/autofill_assistant/browser/actions/click_action.h
+++ b/components/autofill_assistant/browser/actions/click_action.h
@@ -13,6 +13,8 @@
 #include "components/autofill_assistant/browser/actions/action.h"
 
 namespace autofill_assistant {
+class ClientStatus;
+
 // An action to perform a mouse left button click on a given element on Web,
 // which is implemented as a touch tap on Mobile.
 class ClickAction : public Action {
@@ -28,7 +30,7 @@
   void OnWaitForElement(ActionDelegate* delegate,
                         ProcessActionCallback callback,
                         bool element_found);
-  void OnClick(ProcessActionCallback callback, bool status);
+  void OnClick(ProcessActionCallback callback, const ClientStatus& status);
 
   base::WeakPtrFactory<ClickAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/focus_element_action.cc b/components/autofill_assistant/browser/actions/focus_element_action.cc
index b89c242..176941ce 100644
--- a/components/autofill_assistant/browser/actions/focus_element_action.cc
+++ b/components/autofill_assistant/browser/actions/focus_element_action.cc
@@ -29,8 +29,8 @@
   if (!focus_element.title().empty()) {
     delegate->SetStatusMessage(focus_element.title());
   }
-  delegate->ShortWaitForElementExist(
-      Selector(focus_element.element()),
+  delegate->ShortWaitForElement(
+      kVisibilityCheck, Selector(focus_element.element()),
       base::BindOnce(&FocusElementAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -54,10 +54,10 @@
 
 void FocusElementAction::OnFocusElement(ActionDelegate* delegate,
                                         ProcessActionCallback callback,
-                                        bool status) {
+                                        const ClientStatus& status) {
   delegate->SetTouchableElementArea(
       proto().focus_element().touchable_element_area());
-  UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+  UpdateProcessedAction(status);
   std::move(callback).Run(std::move(processed_action_proto_));
 }
 
diff --git a/components/autofill_assistant/browser/actions/focus_element_action.h b/components/autofill_assistant/browser/actions/focus_element_action.h
index 95cafb0..a390450e 100644
--- a/components/autofill_assistant/browser/actions/focus_element_action.h
+++ b/components/autofill_assistant/browser/actions/focus_element_action.h
@@ -27,7 +27,7 @@
                         bool element_found);
   void OnFocusElement(ActionDelegate* delegate,
                       ProcessActionCallback callback,
-                      bool status);
+                      const ClientStatus& status);
 
   base::WeakPtrFactory<FocusElementAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/highlight_element_action.cc b/components/autofill_assistant/browser/actions/highlight_element_action.cc
index eb8f887..c15ceeb2 100644
--- a/components/autofill_assistant/browser/actions/highlight_element_action.cc
+++ b/components/autofill_assistant/browser/actions/highlight_element_action.cc
@@ -23,8 +23,8 @@
     ActionDelegate* delegate,
     ProcessActionCallback callback) {
   DCHECK_GT(proto_.highlight_element().element().selectors_size(), 0);
-  delegate->ShortWaitForElementExist(
-      Selector(proto_.highlight_element().element()),
+  delegate->ShortWaitForElement(
+      kVisibilityCheck, Selector(proto_.highlight_element().element()),
       base::BindOnce(&HighlightElementAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -46,8 +46,8 @@
 }
 
 void HighlightElementAction::OnHighlightElement(ProcessActionCallback callback,
-                                                bool status) {
-  UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+                                                const ClientStatus& status) {
+  UpdateProcessedAction(status);
   std::move(callback).Run(std::move(processed_action_proto_));
 }
 
diff --git a/components/autofill_assistant/browser/actions/highlight_element_action.h b/components/autofill_assistant/browser/actions/highlight_element_action.h
index d83bb663..7f76232 100644
--- a/components/autofill_assistant/browser/actions/highlight_element_action.h
+++ b/components/autofill_assistant/browser/actions/highlight_element_action.h
@@ -29,7 +29,8 @@
   void OnWaitForElement(ActionDelegate* delegate,
                         ProcessActionCallback callback,
                         bool element_found);
-  void OnHighlightElement(ProcessActionCallback callback, bool status);
+  void OnHighlightElement(ProcessActionCallback callback,
+                          const ClientStatus& status);
 
   base::WeakPtrFactory<HighlightElementAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/mock_action_delegate.h b/components/autofill_assistant/browser/actions/mock_action_delegate.h
index b854c93..39122d6e 100644
--- a/components/autofill_assistant/browser/actions/mock_action_delegate.h
+++ b/components/autofill_assistant/browser/actions/mock_action_delegate.h
@@ -25,14 +25,16 @@
   MOCK_METHOD0(CreateBatchElementChecker,
                std::unique_ptr<BatchElementChecker>());
 
-  void ShortWaitForElementExist(
-      const Selector& selector,
-      base::OnceCallback<void(bool)> callback) override {
-    OnShortWaitForElementExist(selector, callback);
+  void ShortWaitForElement(ElementCheckType check_type,
+                           const Selector& selector,
+                           base::OnceCallback<void(bool)> callback) override {
+    OnShortWaitForElement(check_type, selector, callback);
   }
 
-  MOCK_METHOD2(OnShortWaitForElementExist,
-               void(const Selector& selector, base::OnceCallback<void(bool)>&));
+  MOCK_METHOD3(OnShortWaitForElement,
+               void(ElementCheckType check_type,
+                    const Selector& selector,
+                    base::OnceCallback<void(bool)>&));
 
   void WaitForElementVisible(
       base::TimeDelta max_wait_time,
@@ -52,48 +54,50 @@
   MOCK_METHOD0(GetStatusMessage, std::string());
   MOCK_METHOD2(ClickOrTapElement,
                void(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
 
   MOCK_METHOD2(Prompt,
                void(std::unique_ptr<std::vector<Chip>> chips,
                     base::OnceCallback<void()> on_terminate));
   MOCK_METHOD0(CancelPrompt, void());
 
-  void FillAddressForm(const autofill::AutofillProfile* profile,
-                       const Selector& selector,
-                       base::OnceCallback<void(bool)> callback) override {
+  void FillAddressForm(
+      const autofill::AutofillProfile* profile,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override {
     OnFillAddressForm(profile, selector, callback);
   }
 
   MOCK_METHOD3(OnFillAddressForm,
                void(const autofill::AutofillProfile* profile,
                     const Selector& selector,
-                    base::OnceCallback<void(bool)>& callback));
+                    base::OnceCallback<void(const ClientStatus&)>& callback));
 
-  void FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                    const base::string16& cvc,
-                    const Selector& selector,
-                    base::OnceCallback<void(bool)> callback) override {
+  void FillCardForm(
+      std::unique_ptr<autofill::CreditCard> card,
+      const base::string16& cvc,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override {
     OnFillCardForm(card->guid(), selector, callback);
   }
 
   MOCK_METHOD3(OnFillCardForm,
                void(const std::string& guid,
                     const Selector& selector,
-                    base::OnceCallback<void(bool)>& callback));
+                    base::OnceCallback<void(const ClientStatus&)>& callback));
   MOCK_METHOD3(SelectOption,
                void(const Selector& selector,
                     const std::string& selected_option,
-                    base::OnceCallback<void(bool)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
   MOCK_METHOD2(FocusElement,
                void(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
   MOCK_METHOD1(SetTouchableElementArea,
                void(const ElementAreaProto& touchable_element_area));
 
   MOCK_METHOD2(HighlightElement,
                void(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
 
   MOCK_METHOD1(GetPaymentInformation,
                void(std::unique_ptr<PaymentRequestOptions> options));
@@ -103,29 +107,29 @@
   void SetFieldValue(const Selector& selector,
                      const std::string& value,
                      bool ignored_simulate_key_presses,
-                     base::OnceCallback<void(bool)> callback) {
+                     base::OnceCallback<void(const ClientStatus&)> callback) {
     OnSetFieldValue(selector, value, callback);
   }
 
   MOCK_METHOD3(OnSetFieldValue,
                void(const Selector& selector,
                     const std::string& value,
-                    base::OnceCallback<void(bool)>& callback));
+                    base::OnceCallback<void(const ClientStatus&)>& callback));
 
   MOCK_METHOD4(SetAttribute,
                void(const Selector& selector,
                     const std::vector<std::string>& attribute,
                     const std::string& value,
-                    base::OnceCallback<void(bool)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
 
   MOCK_METHOD3(SendKeyboardInput,
                void(const Selector& selector,
                     const std::vector<std::string>& text_parts,
-                    base::OnceCallback<void(bool)> callback));
-  MOCK_METHOD2(
-      GetOuterHtml,
-      void(const Selector& selector,
-           base::OnceCallback<void(bool, const std::string&)> callback));
+                    base::OnceCallback<void(const ClientStatus&)> callback));
+  MOCK_METHOD2(GetOuterHtml,
+               void(const Selector& selector,
+                    base::OnceCallback<void(const ClientStatus&,
+                                            const std::string&)> callback));
   MOCK_METHOD1(LoadURL, void(const GURL& url));
   MOCK_METHOD0(Shutdown, void());
   MOCK_METHOD0(Close, void());
diff --git a/components/autofill_assistant/browser/actions/select_option_action.cc b/components/autofill_assistant/browser/actions/select_option_action.cc
index 2c50550d..508d282f 100644
--- a/components/autofill_assistant/browser/actions/select_option_action.cc
+++ b/components/autofill_assistant/browser/actions/select_option_action.cc
@@ -27,8 +27,8 @@
   DCHECK(select_option.has_selected_option());
   DCHECK_GT(select_option.element().selectors_size(), 0);
 
-  delegate->ShortWaitForElementExist(
-      Selector(select_option.element()),
+  delegate->ShortWaitForElement(
+      kExistenceCheck, Selector(select_option.element()),
       base::BindOnce(&SelectOptionAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -51,8 +51,8 @@
 }
 
 void SelectOptionAction::OnSelectOption(ProcessActionCallback callback,
-                                        bool status) {
-  UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+                                        const ClientStatus& status) {
+  UpdateProcessedAction(status);
   std::move(callback).Run(std::move(processed_action_proto_));
 }
 
diff --git a/components/autofill_assistant/browser/actions/select_option_action.h b/components/autofill_assistant/browser/actions/select_option_action.h
index 1d68e73..6fd743394 100644
--- a/components/autofill_assistant/browser/actions/select_option_action.h
+++ b/components/autofill_assistant/browser/actions/select_option_action.h
@@ -27,7 +27,8 @@
   void OnWaitForElement(ActionDelegate* delegate,
                         ProcessActionCallback callback,
                         bool element_found);
-  void OnSelectOption(ProcessActionCallback callback, bool status);
+  void OnSelectOption(ProcessActionCallback callback,
+                      const ClientStatus& status);
 
   base::WeakPtrFactory<SelectOptionAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/set_attribute_action.cc b/components/autofill_assistant/browser/actions/set_attribute_action.cc
index 47a5681f..7ecb8304 100644
--- a/components/autofill_assistant/browser/actions/set_attribute_action.cc
+++ b/components/autofill_assistant/browser/actions/set_attribute_action.cc
@@ -22,8 +22,8 @@
 
 void SetAttributeAction::InternalProcessAction(ActionDelegate* delegate,
                                                ProcessActionCallback callback) {
-  delegate->ShortWaitForElementExist(
-      Selector(proto_.set_attribute().element()),
+  delegate->ShortWaitForElement(
+      kExistenceCheck, Selector(proto_.set_attribute().element()),
       base::BindOnce(&SetAttributeAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -47,8 +47,8 @@
 }
 
 void SetAttributeAction::OnSetAttribute(ProcessActionCallback callback,
-                                        bool status) {
-  UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+                                        const ClientStatus& status) {
+  UpdateProcessedAction(status);
   std::move(callback).Run(std::move(processed_action_proto_));
 }
 
diff --git a/components/autofill_assistant/browser/actions/set_attribute_action.h b/components/autofill_assistant/browser/actions/set_attribute_action.h
index 8bcb123..3bd8807 100644
--- a/components/autofill_assistant/browser/actions/set_attribute_action.h
+++ b/components/autofill_assistant/browser/actions/set_attribute_action.h
@@ -27,7 +27,8 @@
   void OnWaitForElement(ActionDelegate* delegate,
                         ProcessActionCallback callback,
                         bool element_found);
-  void OnSetAttribute(ProcessActionCallback callback, bool status);
+  void OnSetAttribute(ProcessActionCallback callback,
+                      const ClientStatus& status);
 
   base::WeakPtrFactory<SetAttributeAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc b/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
index 7e143805..1b49379d 100644
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
+++ b/components/autofill_assistant/browser/actions/set_form_field_value_action.cc
@@ -25,8 +25,8 @@
 void SetFormFieldValueAction::InternalProcessAction(
     ActionDelegate* delegate,
     ProcessActionCallback callback) {
-  delegate->ShortWaitForElementExist(
-      Selector(proto_.set_form_value().element()),
+  delegate->ShortWaitForElement(
+      kVisibilityCheck, Selector(proto_.set_form_value().element()),
       base::BindOnce(&SetFormFieldValueAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -46,16 +46,16 @@
 
   // Start with first value, then call OnSetFieldValue() recursively until done.
   OnSetFieldValue(delegate, std::move(callback), /* next = */ 0,
-                  /* status= */ true);
+                  OkClientStatus());
 }
 
 void SetFormFieldValueAction::OnSetFieldValue(ActionDelegate* delegate,
                                               ProcessActionCallback callback,
                                               int next,
-                                              bool status) {
+                                              const ClientStatus& status) {
   // If something went wrong or we are out of values: finish
-  if (!status || next >= proto_.set_form_value().value_size()) {
-    UpdateProcessedAction(status ? ACTION_APPLIED : OTHER_ACTION_STATUS);
+  if (!status.ok() || next >= proto_.set_form_value().value_size()) {
+    UpdateProcessedAction(status);
     std::move(callback).Run(std::move(processed_action_proto_));
     return;
   }
@@ -88,7 +88,7 @@
             << "and only supports US-ASCII values (encountered "
             << key_field.keycode() << "). Use field `key' instead.";
         OnSetFieldValue(delegate, std::move(callback), next,
-                        /* status= */ false);
+                        ClientStatus(INVALID_ACTION));
       }
       break;
     case SetFormFieldValueProto_KeyPress::kKeyboardInput:
@@ -100,7 +100,8 @@
       break;
     default:
       DVLOG(1) << "Unrecognized field for SetFormFieldValueProto_KeyPress";
-      OnSetFieldValue(delegate, std::move(callback), next, /* status= */ false);
+      OnSetFieldValue(delegate, std::move(callback), next,
+                      ClientStatus(INVALID_ACTION));
       break;
   }
 }
diff --git a/components/autofill_assistant/browser/actions/set_form_field_value_action.h b/components/autofill_assistant/browser/actions/set_form_field_value_action.h
index e1620ccc..aba10a7c 100644
--- a/components/autofill_assistant/browser/actions/set_form_field_value_action.h
+++ b/components/autofill_assistant/browser/actions/set_form_field_value_action.h
@@ -30,7 +30,7 @@
   void OnSetFieldValue(ActionDelegate* delegate,
                        ProcessActionCallback callback,
                        int next,
-                       bool status);
+                       const ClientStatus& status);
 
   base::WeakPtrFactory<SetFormFieldValueAction> weak_ptr_factory_;
 
diff --git a/components/autofill_assistant/browser/actions/upload_dom_action.cc b/components/autofill_assistant/browser/actions/upload_dom_action.cc
index 961443f..e79e5153 100644
--- a/components/autofill_assistant/browser/actions/upload_dom_action.cc
+++ b/components/autofill_assistant/browser/actions/upload_dom_action.cc
@@ -22,8 +22,8 @@
 void UploadDomAction::InternalProcessAction(ActionDelegate* delegate,
                                             ProcessActionCallback callback) {
   DCHECK_GT(proto_.upload_dom().tree_root().selectors_size(), 0);
-  delegate->ShortWaitForElementExist(
-      Selector(proto_.upload_dom().tree_root()),
+  delegate->ShortWaitForElement(
+      kExistenceCheck, Selector(proto_.upload_dom().tree_root()),
       base::BindOnce(&UploadDomAction::OnWaitForElement,
                      weak_ptr_factory_.GetWeakPtr(), base::Unretained(delegate),
                      std::move(callback)));
@@ -45,10 +45,10 @@
 }
 
 void UploadDomAction::OnGetOuterHtml(ProcessActionCallback callback,
-                                     bool successful,
+                                     const ClientStatus& status,
                                      const std::string& outer_html) {
-  if (!successful) {
-    UpdateProcessedAction(OTHER_ACTION_STATUS);
+  if (!status.ok()) {
+    UpdateProcessedAction(status);
     std::move(callback).Run(std::move(processed_action_proto_));
     return;
   }
diff --git a/components/autofill_assistant/browser/actions/upload_dom_action.h b/components/autofill_assistant/browser/actions/upload_dom_action.h
index 630db32..c53ab60 100644
--- a/components/autofill_assistant/browser/actions/upload_dom_action.h
+++ b/components/autofill_assistant/browser/actions/upload_dom_action.h
@@ -27,7 +27,7 @@
                         ProcessActionCallback callback,
                         bool element_found);
   void OnGetOuterHtml(ProcessActionCallback callback,
-                      bool successful,
+                      const ClientStatus& status,
                       const std::string& outer_html);
 
   base::WeakPtrFactory<UploadDomAction> weak_ptr_factory_;
diff --git a/components/autofill_assistant/browser/client_status.cc b/components/autofill_assistant/browser/client_status.cc
new file mode 100644
index 0000000..9c5c67b
--- /dev/null
+++ b/components/autofill_assistant/browser/client_status.cc
@@ -0,0 +1,97 @@
+// 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 "components/autofill_assistant/browser/client_status.h"
+
+#include "base/no_destructor.h"
+
+namespace autofill_assistant {
+
+ClientStatus::ClientStatus() : status_(UNKNOWN_ACTION_STATUS) {}
+ClientStatus::ClientStatus(ProcessedActionStatusProto status)
+    : status_(status) {}
+ClientStatus::~ClientStatus() = default;
+
+void ClientStatus::FillProto(ProcessedActionProto* proto) const {
+  proto->set_status(status_);
+  // TODO(b/129387787): Fill extra debugging information collected in the
+  // ClientStatus.
+}
+
+std::ostream& operator<<(std::ostream& out, const ClientStatus& status) {
+  return out << status.status_;
+}
+
+const ClientStatus& OkClientStatus() {
+  static base::NoDestructor<ClientStatus> ok_(ACTION_APPLIED);
+  return *ok_.get();
+}
+
+std::ostream& operator<<(std::ostream& out,
+                         const ProcessedActionStatusProto& status) {
+#ifdef NDEBUG
+  out << static_cast<int>(status);
+  return out;
+#else
+  switch (status) {
+    case ProcessedActionStatusProto::UNKNOWN_ACTION_STATUS:
+      out << "UNKNOWN_ACTION_STATUS";
+      break;
+    case ProcessedActionStatusProto::ELEMENT_RESOLUTION_FAILED:
+      out << "ELEMENT_RESOLUTION_FAILED";
+      break;
+    case ProcessedActionStatusProto::ACTION_APPLIED:
+      out << "ACTION_APPLIED";
+      break;
+    case ProcessedActionStatusProto::OTHER_ACTION_STATUS:
+      out << "OTHER_ACTION_STATUS";
+      break;
+    case ProcessedActionStatusProto::PAYMENT_REQUEST_ERROR:
+      out << "PAYMENT_REQUEST_ERROR";
+      break;
+    case ProcessedActionStatusProto::UNSUPPORTED_ACTION:
+      out << "UNSUPPORTED_ACTION";
+      break;
+    case ProcessedActionStatusProto::MANUAL_FALLBACK:
+      out << "MANUAL_FALLBACK";
+      break;
+    case ProcessedActionStatusProto::INTERRUPT_FAILED:
+      out << "INTERRUPT_FAILED";
+      break;
+    case ProcessedActionStatusProto::USER_ABORTED_ACTION:
+      out << "USER_ABORTED_ACTION";
+      break;
+
+    case ProcessedActionStatusProto::GET_FULL_CARD_FAILED:
+      out << "GET_FULL_CARD_FAILED";
+      break;
+
+    case ProcessedActionStatusProto::PRECONDITION_FAILED:
+      out << "PRECONDITION_FAILED";
+      break;
+
+    case ProcessedActionStatusProto::INVALID_ACTION:
+      out << "INVALID_ACTION";
+      break;
+
+    case ProcessedActionStatusProto::UNSUPPORTED:
+      out << "UNSUPPORTED";
+      break;
+
+    case ProcessedActionStatusProto::TIMED_OUT:
+      out << "TIMED_OUT";
+      break;
+
+    case ProcessedActionStatusProto::ELEMENT_UNSTABLE:
+      out << "ELEMENT_UNSTABLE";
+      break;
+
+      // Intentionally no default case to make compilation fail if a new value
+      // was added to the enum but not to this list.
+  }
+  return out;
+#endif  // NDEBUG
+}
+
+}  // namespace autofill_assistant
diff --git a/components/autofill_assistant/browser/client_status.h b/components/autofill_assistant/browser/client_status.h
new file mode 100644
index 0000000..7964001c
--- /dev/null
+++ b/components/autofill_assistant/browser/client_status.h
@@ -0,0 +1,53 @@
+// 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 COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_STATUS_H_
+#define COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_STATUS_H_
+
+#include <memory>
+
+#include "base/macros.h"
+#include "components/autofill_assistant/browser/service.pb.h"
+
+namespace autofill_assistant {
+
+class ClientStatus {
+ public:
+  ClientStatus();
+  explicit ClientStatus(ProcessedActionStatusProto status);
+  ~ClientStatus();
+
+  // Returns true if this is an OK status.
+  bool ok() const { return status_ == ACTION_APPLIED; }
+
+  // Fills a ProcessedActionProto as appropriate for the current status.
+  void FillProto(ProcessedActionProto* proto) const;
+
+  // Returns the corresponding proto status.
+  ProcessedActionStatusProto proto_status() const { return status_; }
+
+  // Modifies the corresponding proto status.
+  void set_proto_status(ProcessedActionStatusProto status) { status_ = status; }
+
+  // The output operator, for logging.
+  friend std::ostream& operator<<(std::ostream& out,
+                                  const ClientStatus& status);
+
+ private:
+  ProcessedActionStatusProto status_;
+  // TODO(b/129387787): Add more information, to be reported to
+  // ProcessedActionProto
+};
+
+// An OK status.
+const ClientStatus& OkClientStatus();
+
+// Intended for debugging and test error output. Writes a string representation
+// of the status to |out|.
+std::ostream& operator<<(std::ostream& out,
+                         const ProcessedActionStatusProto& status);
+
+}  // namespace autofill_assistant
+
+#endif  // COMPONENTS_AUTOFILL_ASSISTANT_BROWSER_CLIENT_STATUS_H_
diff --git a/components/autofill_assistant/browser/controller.cc b/components/autofill_assistant/browser/controller.cc
index 82513ebf..906b994 100644
--- a/components/autofill_assistant/browser/controller.cc
+++ b/components/autofill_assistant/browser/controller.cc
@@ -82,6 +82,17 @@
 }
 
 UiController* Controller::GetUiController() {
+  if (will_shutdown_) {
+    // Never call the UI controller after having announced a shutdown, no matter
+    // what happens; this is part of the contract of UIDelegate.
+    //
+    // TODO(crbug/925947): Once UIController has become observer, clear list of
+    // observers instead.
+    if (!noop_ui_controller_) {
+      noop_ui_controller_ = std::make_unique<UiController>();
+    }
+    return noop_ui_controller_.get();
+  }
   return client_->GetUiController();
 }
 
@@ -247,11 +258,11 @@
 }
 
 void Controller::EnterState(AutofillAssistantState state) {
-  if (state_ == state)
+  if (state_ == state || state_ == AutofillAssistantState::STOPPED)
     return;
+  // TODO(b/128300038): Forbid transition out of stopped again instead of
+  // ignoring it once shutdown sequence is less complex.
 
-  DCHECK_NE(state_, AutofillAssistantState::STOPPED)
-      << "Unexpected transition from " << state_ << " to " << state;
   DVLOG(2) << __func__ << ": " << state_ << " -> " << state;
 
   state_ = state;
@@ -572,8 +583,9 @@
 bool Controller::Terminate(Metrics::DropOutReason reason) {
   StopPeriodicScriptChecks();
   if (!will_shutdown_) {
+    UiController* ui_controller = GetUiController();
     will_shutdown_ = true;
-    GetUiController()->WillShutdown(reason);
+    ui_controller->WillShutdown(reason);
   }
   if (script_tracker_ && !script_tracker_->Terminate()) {
     terminate_reason_ = reason;
diff --git a/components/autofill_assistant/browser/controller.h b/components/autofill_assistant/browser/controller.h
index 671d33ba..30314c9 100644
--- a/components/autofill_assistant/browser/controller.h
+++ b/components/autofill_assistant/browser/controller.h
@@ -206,6 +206,8 @@
   Client* const client_;
   const base::TickClock* const tick_clock_;
 
+  std::unique_ptr<UiController> noop_ui_controller_;
+
   // Lazily instantiate in GetWebController().
   std::unique_ptr<WebController> web_controller_;
 
diff --git a/components/autofill_assistant/browser/mock_web_controller.h b/components/autofill_assistant/browser/mock_web_controller.h
index 210cbf1..2c42fe9 100644
--- a/components/autofill_assistant/browser/mock_web_controller.h
+++ b/components/autofill_assistant/browser/mock_web_controller.h
@@ -22,23 +22,25 @@
 
   MOCK_METHOD1(LoadURL, void(const GURL&));
 
-  void ClickOrTapElement(const Selector& selector,
-                         base::OnceCallback<void(bool)> callback) override {
+  void ClickOrTapElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override {
     // Transforming callback into a references allows using RunOnceCallback on
     // the argument.
     OnClickOrTapElement(selector, callback);
   }
   MOCK_METHOD2(OnClickOrTapElement,
                void(const Selector& selector,
-                    base::OnceCallback<void(bool)>& callback));
+                    base::OnceCallback<void(const ClientStatus&)>& callback));
 
-  void FocusElement(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback) override {
+  void FocusElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override {
     OnFocusElement(selector, callback);
   }
   MOCK_METHOD2(OnFocusElement,
                void(const Selector& selector,
-                    base::OnceCallback<void(bool)>& callback));
+                    base::OnceCallback<void(const ClientStatus&)>& callback));
 
   void ElementCheck(ElementCheckType check_type,
                     const Selector& selector,
diff --git a/components/autofill_assistant/browser/script_executor.cc b/components/autofill_assistant/browser/script_executor.cc
index 59f6083..291045ef 100644
--- a/components/autofill_assistant/browser/script_executor.cc
+++ b/components/autofill_assistant/browser/script_executor.cc
@@ -18,6 +18,7 @@
 #include "components/autofill_assistant/browser/actions/action.h"
 #include "components/autofill_assistant/browser/batch_element_checker.h"
 #include "components/autofill_assistant/browser/client_memory.h"
+#include "components/autofill_assistant/browser/client_status.h"
 #include "components/autofill_assistant/browser/protocol_utils.h"
 #include "components/autofill_assistant/browser/self_delete_full_card_requester.h"
 #include "components/autofill_assistant/browser/service.h"
@@ -34,58 +35,6 @@
 constexpr base::TimeDelta kShortWaitForElementDeadline =
     base::TimeDelta::FromSeconds(2);
 
-// Intended for debugging. Writes a string representation of the status to
-// |out|.
-std::ostream& operator<<(std::ostream& out,
-                         const ProcessedActionStatusProto& status) {
-#ifdef NDEBUG
-  out << static_cast<int>(status);
-  return out;
-#else
-  switch (status) {
-    case ProcessedActionStatusProto::UNKNOWN_ACTION_STATUS:
-      out << "UNKNOWN_ACTION_STATUS";
-      break;
-    case ProcessedActionStatusProto::ELEMENT_RESOLUTION_FAILED:
-      out << "ELEMENT_RESOLUTION_FAILED";
-      break;
-    case ProcessedActionStatusProto::ACTION_APPLIED:
-      out << "ACTION_APPLIED";
-      break;
-    case ProcessedActionStatusProto::OTHER_ACTION_STATUS:
-      out << "OTHER_ACTION_STATUS";
-      break;
-    case ProcessedActionStatusProto::PAYMENT_REQUEST_ERROR:
-      out << "PAYMENT_REQUEST_ERROR";
-      break;
-    case ProcessedActionStatusProto::UNSUPPORTED_ACTION:
-      out << "UNSUPPORTED_ACTION";
-      break;
-    case ProcessedActionStatusProto::MANUAL_FALLBACK:
-      out << "MANUAL_FALLBACK";
-      break;
-    case ProcessedActionStatusProto::INTERRUPT_FAILED:
-      out << "INTERRUPT_FAILED";
-      break;
-    case ProcessedActionStatusProto::USER_ABORTED_ACTION:
-      out << "USER_ABORTED_ACTION";
-      break;
-
-    case ProcessedActionStatusProto::GET_FULL_CARD_FAILED:
-      out << "GET_FULL_CARD_FAILED";
-      break;
-
-    case ProcessedActionStatusProto::PRECONDITION_FAILED:
-      out << "PRECONDITION_FAILED";
-      break;
-
-      // Intentionally no default case to make compilation fail if a new value
-      // was added to the enum but not to this list.
-  }
-  return out;
-#endif  // NDEBUG
-}
-
 std::ostream& operator<<(std::ostream& out,
                          const ScriptExecutor::AtEnd& at_end) {
 #ifdef NDEBUG
@@ -169,10 +118,11 @@
   return delegate_->GetWebController()->CreateBatchElementChecker();
 }
 
-void ScriptExecutor::ShortWaitForElementExist(
+void ScriptExecutor::ShortWaitForElement(
+    ElementCheckType check_type,
     const Selector& selector,
     base::OnceCallback<void(bool)> callback) {
-  WaitForElement(kShortWaitForElementDeadline, kExistenceCheck, selector,
+  WaitForElement(kShortWaitForElementDeadline, check_type, selector,
                  std::move(callback));
 }
 
@@ -206,7 +156,7 @@
 
 void ScriptExecutor::ClickOrTapElement(
     const Selector& selector,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->ClickOrTapElement(selector,
                                                    std::move(callback));
 }
@@ -298,36 +248,41 @@
   std::move(callback).Run();
 }
 
-void ScriptExecutor::FillAddressForm(const autofill::AutofillProfile* profile,
-                                     const Selector& selector,
-                                     base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::FillAddressForm(
+    const autofill::AutofillProfile* profile,
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->FillAddressForm(profile, selector,
                                                  std::move(callback));
 }
 
-void ScriptExecutor::FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                                  const base::string16& cvc,
-                                  const Selector& selector,
-                                  base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::FillCardForm(
+    std::unique_ptr<autofill::CreditCard> card,
+    const base::string16& cvc,
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->FillCardForm(std::move(card), cvc, selector,
                                               std::move(callback));
 }
 
-void ScriptExecutor::SelectOption(const Selector& selector,
-                                  const std::string& selected_option,
-                                  base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::SelectOption(
+    const Selector& selector,
+    const std::string& selected_option,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->SelectOption(selector, selected_option,
                                               std::move(callback));
 }
 
-void ScriptExecutor::HighlightElement(const Selector& selector,
-                                      base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::HighlightElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->HighlightElement(selector,
                                                   std::move(callback));
 }
 
-void ScriptExecutor::FocusElement(const Selector& selector,
-                                  base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::FocusElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   last_focused_element_selector_ = selector;
   delegate_->GetWebController()->FocusElement(selector, std::move(callback));
 }
@@ -346,18 +301,20 @@
   delegate_->SetProgressVisible(visible);
 }
 
-void ScriptExecutor::SetFieldValue(const Selector& selector,
-                                   const std::string& value,
-                                   bool simulate_key_presses,
-                                   base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::SetFieldValue(
+    const Selector& selector,
+    const std::string& value,
+    bool simulate_key_presses,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->SetFieldValue(
       selector, value, simulate_key_presses, std::move(callback));
 }
 
-void ScriptExecutor::SetAttribute(const Selector& selector,
-                                  const std::vector<std::string>& attribute,
-                                  const std::string& value,
-                                  base::OnceCallback<void(bool)> callback) {
+void ScriptExecutor::SetAttribute(
+    const Selector& selector,
+    const std::vector<std::string>& attribute,
+    const std::string& value,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->SetAttribute(selector, attribute, value,
                                               std::move(callback));
 }
@@ -365,14 +322,15 @@
 void ScriptExecutor::SendKeyboardInput(
     const Selector& selector,
     const std::vector<std::string>& text_parts,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   delegate_->GetWebController()->SendKeyboardInput(selector, text_parts,
                                                    std::move(callback));
 }
 
 void ScriptExecutor::GetOuterHtml(
     const Selector& selector,
-    base::OnceCallback<void(bool, const std::string&)> callback) {
+    base::OnceCallback<void(const ClientStatus&, const std::string&)>
+        callback) {
   delegate_->GetWebController()->GetOuterHtml(selector, std::move(callback));
 }
 
diff --git a/components/autofill_assistant/browser/script_executor.h b/components/autofill_assistant/browser/script_executor.h
index 853078c..8db1df1f 100644
--- a/components/autofill_assistant/browser/script_executor.h
+++ b/components/autofill_assistant/browser/script_executor.h
@@ -102,9 +102,9 @@
 
   // Override ActionDelegate:
   std::unique_ptr<BatchElementChecker> CreateBatchElementChecker() override;
-  void ShortWaitForElementExist(
-      const Selector& selector,
-      base::OnceCallback<void(bool)> callback) override;
+  void ShortWaitForElement(ElementCheckType check_type,
+                           const Selector& selector,
+                           base::OnceCallback<void(bool)> callback) override;
   void WaitForElementVisible(
       base::TimeDelta max_wait_time,
       bool allow_interrupt,
@@ -112,44 +112,54 @@
       base::OnceCallback<void(ProcessedActionStatusProto)> callback) override;
   void SetStatusMessage(const std::string& message) override;
   std::string GetStatusMessage() override;
-  void ClickOrTapElement(const Selector& selector,
-                         base::OnceCallback<void(bool)> callback) override;
+  void ClickOrTapElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
   void GetPaymentInformation(
       std::unique_ptr<PaymentRequestOptions> options) override;
   void GetFullCard(GetFullCardCallback callback) override;
   void Prompt(std::unique_ptr<std::vector<Chip>> chips,
               base::OnceCallback<void()> on_terminate) override;
   void CancelPrompt() override;
-  void FillAddressForm(const autofill::AutofillProfile* profile,
-                       const Selector& selector,
-                       base::OnceCallback<void(bool)> callback) override;
-  void FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                    const base::string16& cvc,
-                    const Selector& selector,
-                    base::OnceCallback<void(bool)> callback) override;
-  void SelectOption(const Selector& selector,
-                    const std::string& selected_option,
-                    base::OnceCallback<void(bool)> callback) override;
-  void HighlightElement(const Selector& selector,
-                        base::OnceCallback<void(bool)> callback) override;
-  void FocusElement(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback) override;
+  void FillAddressForm(
+      const autofill::AutofillProfile* profile,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void FillCardForm(
+      std::unique_ptr<autofill::CreditCard> card,
+      const base::string16& cvc,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void SelectOption(
+      const Selector& selector,
+      const std::string& selected_option,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void HighlightElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void FocusElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
   void SetTouchableElementArea(
       const ElementAreaProto& touchable_element_area) override;
-  void SetFieldValue(const Selector& selector,
-                     const std::string& value,
-                     bool simulate_key_presses,
-                     base::OnceCallback<void(bool)> callback) override;
-  void SetAttribute(const Selector& selector,
-                    const std::vector<std::string>& attribute,
-                    const std::string& value,
-                    base::OnceCallback<void(bool)> callback) override;
-  void SendKeyboardInput(const Selector& selector,
-                         const std::vector<std::string>& text_parts,
-                         base::OnceCallback<void(bool)> callback) override;
+  void SetFieldValue(
+      const Selector& selector,
+      const std::string& value,
+      bool simulate_key_presses,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void SetAttribute(
+      const Selector& selector,
+      const std::vector<std::string>& attribute,
+      const std::string& value,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
+  void SendKeyboardInput(
+      const Selector& selector,
+      const std::vector<std::string>& text_parts,
+      base::OnceCallback<void(const ClientStatus&)> callback) override;
   void GetOuterHtml(
       const Selector& selector,
-      base::OnceCallback<void(bool, const std::string&)> callback) override;
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback) override;
   void LoadURL(const GURL& url) override;
   void Shutdown() override;
   void Close() override;
diff --git a/components/autofill_assistant/browser/script_executor_unittest.cc b/components/autofill_assistant/browser/script_executor_unittest.cc
index 955a728..9ee5776 100644
--- a/components/autofill_assistant/browser/script_executor_unittest.cc
+++ b/components/autofill_assistant/browser/script_executor_unittest.cc
@@ -63,12 +63,12 @@
     // In this test, "tell" actions always succeed and "click" actions always
     // fail. The following makes a click action fail immediately
     ON_CALL(mock_web_controller_, OnClickOrTapElement(_, _))
-        .WillByDefault(RunOnceCallback<1>(false));
+        .WillByDefault(RunOnceCallback<1>(ClientStatus(OTHER_ACTION_STATUS)));
 
     ON_CALL(mock_web_controller_, OnElementCheck(_, _, _))
         .WillByDefault(RunOnceCallback<2>(true));
     ON_CALL(mock_web_controller_, OnFocusElement(_, _))
-        .WillByDefault(RunOnceCallback<1>(true));
+        .WillByDefault(RunOnceCallback<1>(OkClientStatus()));
   }
 
  protected:
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index b953a1b..13569187 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -404,6 +404,18 @@
   // failed.
   //
   PRECONDITION_FAILED = 10;
+
+  // The action definition returned by the server was rejected.
+  INVALID_ACTION = 11;
+
+  // Executing the action as defined is unsupported.
+  UNSUPPORTED = 12;
+
+  // Timed out waiting for the document to load.
+  TIMED_OUT = 13;
+
+  // Failed to get a stable position for the element, usually to click on it.
+  ELEMENT_UNSTABLE = 14;
 }
 
 // The pseudo type values come from
@@ -728,6 +740,10 @@
     bool show_image_placeholder = 10;
   }
 
+  // Whether to show the original URL where image is extracted from. Only useful
+  // when 'image_url' is set.
+  optional bool show_attribution = 12;
+
   // Optional label to provide additional price information.
   optional string total_price_label = 9;
   // The price containing the total amount and the currency to pay, formatted
diff --git a/components/autofill_assistant/browser/web_controller.cc b/components/autofill_assistant/browser/web_controller.cc
index 5f5d3e7..cad7111 100644
--- a/components/autofill_assistant/browser/web_controller.cc
+++ b/components/autofill_assistant/browser/web_controller.cc
@@ -419,7 +419,7 @@
   void Start(FindElementCallback callback_);
 
  private:
-  void SendResult();
+  void SendResult(const ClientStatus& status);
   void OnGetDocumentElement(std::unique_ptr<runtime::EvaluateResult> result);
   void RecursiveFindElement(const std::string& object_id, size_t index);
   void OnQuerySelectorAll(
@@ -471,10 +471,10 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-void WebController::ElementFinder::SendResult() {
+void WebController::ElementFinder::SendResult(const ClientStatus& status) {
   DCHECK(callback_);
   DCHECK(element_result_);
-  std::move(callback_).Run(std::move(element_result_));
+  std::move(callback_).Run(status, std::move(element_result_));
 }
 
 void WebController::ElementFinder::OnGetDocumentElement(
@@ -484,7 +484,7 @@
   element_result_->object_id = "";
   if (!result || !result->GetResult() || !result->GetResult()->HasObjectId()) {
     DVLOG(1) << __func__ << " Failed to get document root element.";
-    SendResult();
+    SendResult(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -517,7 +517,7 @@
     size_t index,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
   if (!result || !result->GetResult() || !result->GetResult()->HasObjectId()) {
-    SendResult();
+    SendResult(ClientStatus(ELEMENT_RESOLUTION_FAILED));
     return;
   }
 
@@ -528,7 +528,7 @@
     if (selector_.pseudo_type == PseudoType::UNDEFINED) {
       // Return object id of the element.
       element_result_->object_id = result->GetResult()->GetObjectId();
-      SendResult();
+      SendResult(OkClientStatus());
       return;
     }
 
@@ -536,7 +536,7 @@
     dom::PseudoType pseudo_type;
     if (!ConvertPseudoType(selector_.pseudo_type, &pseudo_type)) {
       // Return empty result.
-      SendResult();
+      SendResult(ClientStatus(INVALID_ACTION));
       return;
     }
 
@@ -564,7 +564,7 @@
     std::unique_ptr<dom::DescribeNodeResult> result) {
   if (!result || !result->GetNode()) {
     DVLOG(1) << __func__ << " Failed to describe the node for pseudo element.";
-    SendResult();
+    SendResult(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -586,7 +586,7 @@
   }
 
   // Failed to find the pseudo element: run the callback with empty result.
-  SendResult();
+  SendResult(ClientStatus(ELEMENT_RESOLUTION_FAILED));
 }
 
 void WebController::ElementFinder::OnResolveNodeForPseudoElement(
@@ -595,7 +595,7 @@
     element_result_->object_id = result->GetObject()->GetObjectId();
   }
 
-  SendResult();
+  SendResult(OkClientStatus());
 }
 
 void WebController::ElementFinder::OnDescribeNode(
@@ -604,7 +604,7 @@
     std::unique_ptr<dom::DescribeNodeResult> result) {
   if (!result || !result->GetNode()) {
     DVLOG(1) << __func__ << " Failed to describe the node.";
-    SendResult();
+    SendResult(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -635,13 +635,13 @@
         frame_name, node->GetContentDocument()->GetDocumentURL());
     if (!element_result_->container_frame_host) {
       DVLOG(1) << __func__ << " Failed to find corresponding owner frame.";
-      SendResult();
+      SendResult(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
       return;
     }
   } else if (node->HasFrameId()) {
     // TODO(crbug.com/806868): Support out-of-process iframe.
     DVLOG(3) << "Warning (unsupported): the element is inside an OOPIF.";
-    SendResult();
+    SendResult(ClientStatus(UNSUPPORTED));
     return;
   }
 
@@ -669,7 +669,7 @@
     std::unique_ptr<dom::ResolveNodeResult> result) {
   if (!result || !result->GetObject() || !result->GetObject()->HasObjectId()) {
     DVLOG(1) << __func__ << " Failed to resolve object id from backend id.";
-    SendResult();
+    SendResult(ClientStatus(OTHER_ACTION_STATUS));
     return;
   }
 
@@ -719,8 +719,9 @@
       content::NavigationController::LoadURLParams(url));
 }
 
-void WebController::ClickOrTapElement(const Selector& selector,
-                                      base::OnceCallback<void(bool)> callback) {
+void WebController::ClickOrTapElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector;
 #if defined(OS_ANDROID)
   TapElement(selector, std::move(callback));
@@ -731,8 +732,9 @@
 #endif
 }
 
-void WebController::ClickElement(const Selector& selector,
-                                 base::OnceCallback<void(bool)> callback) {
+void WebController::ClickElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DCHECK(!selector.empty());
   FindElement(selector, /* strict_mode= */ true,
               base::BindOnce(&WebController::OnFindElementForClickOrTap,
@@ -740,8 +742,9 @@
                              std::move(callback), /* is_a_click= */ true));
 }
 
-void WebController::TapElement(const Selector& selector,
-                               base::OnceCallback<void(bool)> callback) {
+void WebController::TapElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DCHECK(!selector.empty());
   FindElement(selector, /* strict_mode= */ true,
               base::BindOnce(&WebController::OnFindElementForClickOrTap,
@@ -750,13 +753,14 @@
 }
 
 void WebController::OnFindElementForClickOrTap(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     bool is_a_click,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> result) {
   // Found element must belong to a frame.
-  if (!result->container_frame_host || result->object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(1) << __func__ << " Failed to find the element to click or tap.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(status);
     return;
   }
 
@@ -770,12 +774,12 @@
 }
 
 void WebController::OnWaitDocumentToBecomeInteractiveForClickOrTap(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     bool is_a_click,
     std::unique_ptr<FindElementResult> target_element,
     bool result) {
   if (!result) {
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(TIMED_OUT));
     return;
   }
 
@@ -785,7 +789,7 @@
 void WebController::ClickOrTapElement(
     std::unique_ptr<FindElementResult> target_element,
     bool is_a_click,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   std::string element_object_id = target_element->object_id;
   std::vector<std::unique_ptr<runtime::CallArgument>> argument;
   argument.emplace_back(
@@ -804,12 +808,12 @@
 
 void WebController::OnScrollIntoView(
     std::unique_ptr<FindElementResult> target_element,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     bool is_a_click,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
   if (!result || result->HasExceptionDetails()) {
     DVLOG(1) << __func__ << " Failed to scroll the element.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -827,7 +831,7 @@
 
 void WebController::TapOrClickOnCoordinates(
     ElementPositionGetter* getter_to_release,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     bool is_a_click,
     bool has_coordinates,
     int x,
@@ -836,7 +840,7 @@
 
   if (!has_coordinates) {
     DVLOG(1) << __func__ << " Failed to get element position.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(ELEMENT_UNSTABLE));
     return;
   }
 
@@ -869,14 +873,14 @@
 }
 
 void WebController::OnDispatchPressMouseEvent(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     int x,
     int y,
     std::unique_ptr<input::DispatchMouseEventResult> result) {
   if (!result) {
     DVLOG(1) << __func__
              << " Failed to dispatch mouse left button pressed event.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -893,17 +897,17 @@
 }
 
 void WebController::OnDispatchReleaseMouseEvent(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<input::DispatchMouseEventResult> result) {
-  OnResult(true, std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
 void WebController::OnDispatchTouchEventStart(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<input::DispatchTouchEventResult> result) {
   if (!result) {
     DVLOG(1) << __func__ << " Failed to dispatch touch start event.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -919,10 +923,10 @@
 }
 
 void WebController::OnDispatchTouchEventEnd(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<input::DispatchTouchEventResult> result) {
   DCHECK(result);
-  OnResult(true, std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
 void WebController::ElementCheck(ElementCheckType check_type,
@@ -940,13 +944,14 @@
 void WebController::OnFindElementForCheck(
     ElementCheckType check_type,
     base::OnceCallback<void(bool)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> result) {
-  if (result->object_id.empty()) {
-    OnResult(false, std::move(callback));
+  if (!status.ok()) {
+    std::move(callback).Run(false);
     return;
   }
   if (check_type == kExistenceCheck) {
-    OnResult(true, std::move(callback));
+    std::move(callback).Run(true);
     return;
   }
   DCHECK_EQ(check_type, kVisibilityCheck);
@@ -960,8 +965,8 @@
 void WebController::OnGetBoxModelForVisible(
     base::OnceCallback<void(bool)> callback,
     std::unique_ptr<dom::GetBoxModelResult> result) {
-  OnResult(result && result->GetModel() && result->GetModel()->GetContent(),
-           std::move(callback));
+  std::move(callback).Run(result && result->GetModel() &&
+                          result->GetModel()->GetContent());
 }
 
 void WebController::FindElement(const Selector& selector,
@@ -978,29 +983,19 @@
 void WebController::OnFindElementResult(
     ElementFinder* finder_to_release,
     FindElementCallback callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> result) {
   pending_workers_.erase(finder_to_release);
-  std::move(callback).Run(std::move(result));
-}
-
-void WebController::OnResult(bool result,
-                             base::OnceCallback<void(bool)> callback) {
-  std::move(callback).Run(result);
-}
-
-void WebController::OnResult(
-    bool exists,
-    const std::string& value,
-    base::OnceCallback<void(bool, const std::string&)> callback) {
-  std::move(callback).Run(exists, value);
+  std::move(callback).Run(status, std::move(result));
 }
 
 void WebController::OnFindElementForFocusElement(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  if (element_result->object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(1) << __func__ << " Failed to find the element to focus on.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(status);
     return;
   }
 
@@ -1014,11 +1009,11 @@
 }
 
 void WebController::OnWaitDocumentToBecomeInteractiveForFocusElement(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<FindElementResult> target_element,
     bool result) {
   if (!result) {
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(ELEMENT_UNSTABLE));
     return;
   }
 
@@ -1038,19 +1033,20 @@
 }
 
 void WebController::OnFocusElement(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
   if (!result || result->HasExceptionDetails()) {
     DVLOG(1) << __func__ << " Failed to focus on element.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
-  OnResult(true, std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
-void WebController::FillAddressForm(const autofill::AutofillProfile* profile,
-                                    const Selector& selector,
-                                    base::OnceCallback<void(bool)> callback) {
+void WebController::FillAddressForm(
+    const autofill::AutofillProfile* profile,
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << selector;
   auto data_to_autofill = std::make_unique<FillFormInputData>();
   data_to_autofill->profile =
@@ -1066,11 +1062,12 @@
 void WebController::OnFindElementForFillingForm(
     std::unique_ptr<FillFormInputData> data_to_autofill,
     const Selector& selector,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  if (element_result->object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(1) << __func__ << " Failed to find the element for filling the form.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(status);
     return;
   }
 
@@ -1090,13 +1087,13 @@
 
 void WebController::OnGetFormAndFieldDataForFillingForm(
     std::unique_ptr<FillFormInputData> data_to_autofill,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     content::RenderFrameHost* container_frame_host,
     const autofill::FormData& form_data,
     const autofill::FormFieldData& form_field) {
   if (form_data.fields.empty()) {
     DVLOG(1) << __func__ << " Failed to get form data to fill form.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -1104,7 +1101,7 @@
       ContentAutofillDriver::GetForRenderFrameHost(container_frame_host);
   if (!driver) {
     DVLOG(1) << __func__ << " Failed to get the autofill driver.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
 
@@ -1117,13 +1114,14 @@
                                                 form_data, form_field);
   }
 
-  OnResult(true, std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
-void WebController::FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                                 const base::string16& cvc,
-                                 const Selector& selector,
-                                 base::OnceCallback<void(bool)> callback) {
+void WebController::FillCardForm(
+    std::unique_ptr<autofill::CreditCard> card,
+    const base::string16& cvc,
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector;
   auto data_to_autofill = std::make_unique<FillFormInputData>();
   data_to_autofill->card = std::move(card);
@@ -1136,9 +1134,10 @@
                              std::move(callback)));
 }
 
-void WebController::SelectOption(const Selector& selector,
-                                 const std::string& selected_option,
-                                 base::OnceCallback<void(bool)> callback) {
+void WebController::SelectOption(
+    const Selector& selector,
+    const std::string& selected_option,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector << ", option=" << selected_option;
   FindElement(selector,
               /* strict_mode= */ true,
@@ -1149,12 +1148,12 @@
 
 void WebController::OnFindElementForSelectOption(
     const std::string& selected_option,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(1) << __func__ << " Failed to find the element to select an option.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(status);
     return;
   }
 
@@ -1165,7 +1164,7 @@
           .Build());
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
-          .SetObjectId(object_id)
+          .SetObjectId(element_result->object_id)
           .SetArguments(std::move(argument))
           .SetFunctionDeclaration(std::string(kSelectOptionScript))
           .SetReturnByValue(true)
@@ -1175,21 +1174,21 @@
 }
 
 void WebController::OnSelectOption(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  if (!result || result->HasExceptionDetails()) {
+  if (!result || result->HasExceptionDetails() ||
+      !result->GetResult()->GetValue()->GetBool()) {
     DVLOG(1) << __func__ << " Failed to select option.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
-
-  // Read the result returned from Javascript code.
   DCHECK(result->GetResult()->GetValue()->is_bool());
-  OnResult(result->GetResult()->GetValue()->GetBool(), std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
-void WebController::HighlightElement(const Selector& selector,
-                                     base::OnceCallback<void(bool)> callback) {
+void WebController::HighlightElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector;
   FindElement(
       selector,
@@ -1199,15 +1198,16 @@
 }
 
 void WebController::OnFindElementForHighlightElement(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(1) << __func__ << " Failed to find the element to highlight.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(status);
     return;
   }
 
+  const std::string& object_id = element_result->object_id;
   std::vector<std::unique_ptr<runtime::CallArgument>> argument;
   argument.emplace_back(
       runtime::CallArgument::Builder().SetObjectId(object_id).Build());
@@ -1223,20 +1223,21 @@
 }
 
 void WebController::OnHighlightElement(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  if (!result || result->HasExceptionDetails()) {
+  if (!result || result->HasExceptionDetails() ||
+      !result->GetResult()->GetValue()->GetBool()) {
     DVLOG(1) << __func__ << " Failed to highlight element.";
-    OnResult(false, std::move(callback));
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS));  // unexpected
     return;
   }
-  // Read the result returned from Javascript code.
   DCHECK(result->GetResult()->GetValue()->is_bool());
-  OnResult(result->GetResult()->GetValue()->GetBool(), std::move(callback));
+  std::move(callback).Run(OkClientStatus());
 }
 
-void WebController::FocusElement(const Selector& selector,
-                                 base::OnceCallback<void(bool)> callback) {
+void WebController::FocusElement(
+    const Selector& selector,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector;
   DCHECK(!selector.empty());
   FindElement(
@@ -1258,10 +1259,11 @@
 
 void WebController::OnFindElementForGetFieldValue(
     base::OnceCallback<void(bool, const std::string&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
   const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
-    OnResult(/* exists= */ false, "", std::move(callback));
+  if (!status.ok()) {
+    std::move(callback).Run(/* exists= */ false, "");
     return;
   }
 
@@ -1279,20 +1281,21 @@
     base::OnceCallback<void(bool, const std::string&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
   if (!result || result->HasExceptionDetails()) {
-    OnResult(/* exists= */ true, "", std::move(callback));
+    std::move(callback).Run(/* exists= */ true, "");
     return;
   }
 
   // Read the result returned from Javascript code.
   DCHECK(result->GetResult()->GetValue()->is_string());
-  OnResult(/* exists= */ true, result->GetResult()->GetValue()->GetString(),
-           std::move(callback));
+  std::move(callback).Run(/* exists= */ true,
+                          result->GetResult()->GetValue()->GetString());
 }
 
-void WebController::SetFieldValue(const Selector& selector,
-                                  const std::string& value,
-                                  bool simulate_key_presses,
-                                  base::OnceCallback<void(bool)> callback) {
+void WebController::SetFieldValue(
+    const Selector& selector,
+    const std::string& value,
+    bool simulate_key_presses,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector << ", value=" << value
            << ", simulate_key_presses=" << simulate_key_presses;
   if (simulate_key_presses) {
@@ -1304,7 +1307,7 @@
       if (!base::WideToUTF8(&wide_char, 1, &utf8_char)) {
         DVLOG(1) << __func__
                  << " Failed to convert character to UTF-8: " << wide_char;
-        OnResult(false, std::move(callback));
+        std::move(callback).Run(ClientStatus(INVALID_ACTION));
         return;
       }
 
@@ -1328,7 +1331,7 @@
 void WebController::InternalSetFieldValue(
     const Selector& selector,
     const std::string& value,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   FindElement(selector,
               /* strict_mode= */ true,
               base::BindOnce(&WebController::OnFindElementForSetFieldValue,
@@ -1339,10 +1342,10 @@
 void WebController::OnClearFieldForSendKeyboardInput(
     const Selector& selector,
     const std::vector<std::string>& utf8_chars,
-    base::OnceCallback<void(bool)> callback,
-    bool clear_status) {
-  if (!clear_status) {
-    OnResult(false, std::move(callback));
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& clear_status) {
+  if (!clear_status.ok()) {
+    std::move(callback).Run(clear_status);
     return;
   }
   SendKeyboardInput(selector, utf8_chars, std::move(callback));
@@ -1350,10 +1353,10 @@
 
 void WebController::OnClickElementForSendKeyboardInput(
     const std::vector<std::string>& utf8_chars,
-    base::OnceCallback<void(bool)> callback,
-    bool click_status) {
-  if (!click_status) {
-    OnResult(false, std::move(callback));
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& click_status) {
+  if (!click_status.ok()) {
+    std::move(callback).Run(click_status);
     return;
   }
   DispatchKeyboardTextDownEvent(utf8_chars, 0, std::move(callback));
@@ -1362,9 +1365,9 @@
 void WebController::DispatchKeyboardTextDownEvent(
     const std::vector<std::string>& utf8_chars,
     size_t index,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   if (index >= utf8_chars.size()) {
-    OnResult(true, std::move(callback));
+    std::move(callback).Run(OkClientStatus());
     return;
   }
 
@@ -1380,7 +1383,7 @@
 void WebController::DispatchKeyboardTextUpEvent(
     const std::vector<std::string>& utf8_chars,
     size_t index,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DCHECK_LT(index, utf8_chars.size());
   devtools_client_->GetInput()->DispatchKeyEvent(
       CreateKeyEventParamsFromText(
@@ -1403,16 +1406,16 @@
     int key_code,
     base::OnceCallback<void(bool)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  OnResult(result && !result->HasExceptionDetails(), std::move(callback));
+  std::move(callback).Run(result && !result->HasExceptionDetails());
 }
 
 void WebController::OnFindElementForSetFieldValue(
     const std::string& value,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
-    OnResult(false, std::move(callback));
+  if (!status.ok()) {
+    std::move(callback).Run(status);
     return;
   }
 
@@ -1423,7 +1426,7 @@
           .Build());
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
-          .SetObjectId(object_id)
+          .SetObjectId(element_result->object_id)
           .SetArguments(std::move(argument))
           .SetFunctionDeclaration(std::string(kSetValueAttributeScript))
           .Build(),
@@ -1432,15 +1435,18 @@
 }
 
 void WebController::OnSetValueAttribute(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  OnResult(result && !result->HasExceptionDetails(), std::move(callback));
+  std::move(callback).Run(result && !result->HasExceptionDetails()
+                              ? OkClientStatus()
+                              : ClientStatus(OTHER_ACTION_STATUS));
 }
 
-void WebController::SetAttribute(const Selector& selector,
-                                 const std::vector<std::string>& attribute,
-                                 const std::string& value,
-                                 base::OnceCallback<void(bool)> callback) {
+void WebController::SetAttribute(
+    const Selector& selector,
+    const std::vector<std::string>& attribute,
+    const std::string& value,
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector << ", attribute=["
            << base::JoinString(attribute, ",") << "], value=" << value;
 
@@ -1456,11 +1462,11 @@
 void WebController::OnFindElementForSetAttribute(
     const std::vector<std::string>& attribute,
     const std::string& value,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
-    OnResult(false, std::move(callback));
+  if (!status.ok()) {
+    std::move(callback).Run(status);
     return;
   }
 
@@ -1480,7 +1486,7 @@
           .Build());
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
-          .SetObjectId(object_id)
+          .SetObjectId(element_result->object_id)
           .SetArguments(std::move(arguments))
           .SetFunctionDeclaration(std::string(kSetAttributeScript))
           .Build(),
@@ -1489,15 +1495,17 @@
 }
 
 void WebController::OnSetAttribute(
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  OnResult(result && !result->HasExceptionDetails(), std::move(callback));
+  std::move(callback).Run(result && !result->HasExceptionDetails()
+                              ? OkClientStatus()
+                              : ClientStatus(OTHER_ACTION_STATUS));
 }
 
 void WebController::SendKeyboardInput(
     const Selector& selector,
     const std::vector<std::string>& utf8_chars,
-    base::OnceCallback<void(bool)> callback) {
+    base::OnceCallback<void(const ClientStatus&)> callback) {
   DVLOG(3) << __func__ << " " << selector
            << ", input=" << base::JoinString(utf8_chars, "");
   DCHECK(!selector.empty());
@@ -1511,8 +1519,13 @@
 void WebController::OnFindElementForSendKeyboardInput(
     const Selector& selector,
     const std::vector<std::string>& utf8_chars,
-    base::OnceCallback<void(bool)> callback,
+    base::OnceCallback<void(const ClientStatus&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
+  if (!status.ok()) {
+    std::move(callback).Run(status);
+    return;
+  }
   ClickElement(selector, base::BindOnce(
                              &WebController::OnClickElementForSendKeyboardInput,
                              weak_ptr_factory_.GetWeakPtr(), utf8_chars,
@@ -1521,7 +1534,8 @@
 
 void WebController::GetOuterHtml(
     const Selector& selector,
-    base::OnceCallback<void(bool, const std::string&)> callback) {
+    base::OnceCallback<void(const ClientStatus&, const std::string&)>
+        callback) {
   DVLOG(3) << __func__ << " " << selector;
   FindElement(
       selector,
@@ -1546,8 +1560,9 @@
 
 void WebController::OnFindElementForPosition(
     base::OnceCallback<void(bool, const RectF&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> result) {
-  if (result->object_id.empty()) {
+  if (!status.ok()) {
     RectF empty;
     std::move(callback).Run(false, empty);
     return;
@@ -1602,18 +1617,18 @@
 }
 
 void WebController::OnFindElementForGetOuterHtml(
-    base::OnceCallback<void(bool, const std::string&)> callback,
+    base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
+    const ClientStatus& status,
     std::unique_ptr<FindElementResult> element_result) {
-  const std::string object_id = element_result->object_id;
-  if (object_id.empty()) {
+  if (!status.ok()) {
     DVLOG(2) << __func__ << " Failed to find element for GetOuterHtml";
-    OnResult(false, "", std::move(callback));
+    std::move(callback).Run(status, "");
     return;
   }
 
   devtools_client_->GetRuntime()->CallFunctionOn(
       runtime::CallFunctionOnParams::Builder()
-          .SetObjectId(object_id)
+          .SetObjectId(element_result->object_id)
           .SetFunctionDeclaration(std::string(kGetOuterHtmlScript))
           .SetReturnByValue(true)
           .Build(),
@@ -1622,18 +1637,17 @@
 }
 
 void WebController::OnGetOuterHtml(
-    base::OnceCallback<void(bool, const std::string&)> callback,
+    base::OnceCallback<void(const ClientStatus&, const std::string&)> callback,
     std::unique_ptr<runtime::CallFunctionOnResult> result) {
-  if (!result || result->HasExceptionDetails()) {
-    DVLOG(2) << __func__ << " Failed to find element for GetOuterHtml";
-    OnResult(false, "", std::move(callback));
+  if (!result || result->HasExceptionDetails() || !result->GetResult() ||
+      !result->GetResult()->GetValue()->is_string()) {
+    DVLOG(2) << __func__ << " Failed to get HTML content for GetOuterHtml";
+    std::move(callback).Run(ClientStatus(OTHER_ACTION_STATUS), "");
     return;
   }
 
-  // Read the result returned from Javascript code.
-  DCHECK(result->GetResult()->GetValue()->is_string());
-  OnResult(true, result->GetResult()->GetValue()->GetString(),
-           std::move(callback));
+  std::move(callback).Run(OkClientStatus(),
+                          result->GetResult()->GetValue()->GetString());
 }
 
 void WebController::SetCookie(const std::string& domain,
diff --git a/components/autofill_assistant/browser/web_controller.h b/components/autofill_assistant/browser/web_controller.h
index 6f2171f6..3a603cf 100644
--- a/components/autofill_assistant/browser/web_controller.h
+++ b/components/autofill_assistant/browser/web_controller.h
@@ -14,6 +14,7 @@
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
 #include "components/autofill_assistant/browser/batch_element_checker.h"
+#include "components/autofill_assistant/browser/client_status.h"
 #include "components/autofill_assistant/browser/devtools/devtools/domains/types_dom.h"
 #include "components/autofill_assistant/browser/devtools/devtools/domains/types_input.h"
 #include "components/autofill_assistant/browser/devtools/devtools/domains/types_network.h"
@@ -66,62 +67,72 @@
 
   // Perform a mouse left button click or a touch tap on the element given by
   // |selector| and return the result through callback.
-  virtual void ClickOrTapElement(const Selector& selector,
-                                 base::OnceCallback<void(bool)> callback);
+  virtual void ClickOrTapElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Fill the address form given by |selector| with the given address
   // |profile|.
-  virtual void FillAddressForm(const autofill::AutofillProfile* profile,
-                               const Selector& selector,
-                               base::OnceCallback<void(bool)> callback);
+  virtual void FillAddressForm(
+      const autofill::AutofillProfile* profile,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Fill the card form given by |selector| with the given |card| and its
   // |cvc|.
-  virtual void FillCardForm(std::unique_ptr<autofill::CreditCard> card,
-                            const base::string16& cvc,
-                            const Selector& selector,
-                            base::OnceCallback<void(bool)> callback);
+  virtual void FillCardForm(
+      std::unique_ptr<autofill::CreditCard> card,
+      const base::string16& cvc,
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Select the option given by |selector| and the value of the option to be
   // picked.
-  virtual void SelectOption(const Selector& selector,
-                            const std::string& selected_option,
-                            base::OnceCallback<void(bool)> callback);
+  virtual void SelectOption(
+      const Selector& selector,
+      const std::string& selected_option,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Highlight an element given by |selector|.
-  virtual void HighlightElement(const Selector& selector,
-                                base::OnceCallback<void(bool)> callback);
+  virtual void HighlightElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Focus on element given by |selector|.
-  virtual void FocusElement(const Selector& selector,
-                            base::OnceCallback<void(bool)> callback);
+  virtual void FocusElement(
+      const Selector& selector,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Set the |value| of field |selector| and return the result through
   // |callback|. If |simulate_key_presses| is true, the value will be set by
   // clicking the field and then simulating key presses, otherwise the `value`
   // attribute will be set directly.
-  virtual void SetFieldValue(const Selector& selector,
-                             const std::string& value,
-                             bool simulate_key_presses,
-                             base::OnceCallback<void(bool)> callback);
+  virtual void SetFieldValue(
+      const Selector& selector,
+      const std::string& value,
+      bool simulate_key_presses,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Set the |value| of the |attribute| of the element given by |selector|.
-  virtual void SetAttribute(const Selector& selector,
-                            const std::vector<std::string>& attribute,
-                            const std::string& value,
-                            base::OnceCallback<void(bool)> callback);
+  virtual void SetAttribute(
+      const Selector& selector,
+      const std::vector<std::string>& attribute,
+      const std::string& value,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Sets the keyboard focus to |selector| and inputs the specified UTF-8
   // characters in the specified order.
   // Returns the result through |callback|.
-  virtual void SendKeyboardInput(const Selector& selector,
-                                 const std::vector<std::string>& utf8_chars,
-                                 base::OnceCallback<void(bool)> callback);
+  virtual void SendKeyboardInput(
+      const Selector& selector,
+      const std::vector<std::string>& utf8_chars,
+      base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Return the outerHTML of |selector|.
   virtual void GetOuterHtml(
       const Selector& selector,
-      base::OnceCallback<void(bool, const std::string&)> callback);
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback);
 
   // Create a helper for checking element existence and field value.
   virtual std::unique_ptr<BatchElementChecker> CreateBatchElementChecker();
@@ -210,7 +221,8 @@
     std::string object_id;
   };
   using FindElementCallback =
-      base::OnceCallback<void(std::unique_ptr<FindElementResult>)>;
+      base::OnceCallback<void(const ClientStatus&,
+                              std::unique_ptr<FindElementResult>)>;
 
   struct FillFormInputData {
     FillFormInputData();
@@ -227,52 +239,59 @@
   // Perform a mouse left button click on the element given by |selector| and
   // return the result through callback.
   void ClickElement(const Selector& selector,
-                    base::OnceCallback<void(bool)> callback);
+                    base::OnceCallback<void(const ClientStatus&)> callback);
 
   // Perform a touch tap on the element given by |selector| and return the
   // result through callback.
   void TapElement(const Selector& selector,
-                  base::OnceCallback<void(bool)> callback);
+                  base::OnceCallback<void(const ClientStatus&)> callback);
 
-  void OnFindElementForClickOrTap(base::OnceCallback<void(bool)> callback,
-                                  bool is_a_click,
-                                  std::unique_ptr<FindElementResult> result);
+  void OnFindElementForClickOrTap(
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      bool is_a_click,
+      const ClientStatus& status,
+      std::unique_ptr<FindElementResult> result);
   void OnWaitDocumentToBecomeInteractiveForClickOrTap(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       bool is_a_click,
       std::unique_ptr<FindElementResult> target_element,
       bool result);
-  void OnFindElementForTap(base::OnceCallback<void(bool)> callback,
-                           std::unique_ptr<FindElementResult> result);
-  void ClickOrTapElement(std::unique_ptr<FindElementResult> target_element,
-                         bool is_a_click,
-                         base::OnceCallback<void(bool)> callback);
+  void OnFindElementForTap(
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
+      std::unique_ptr<FindElementResult> result);
+  void ClickOrTapElement(
+      std::unique_ptr<FindElementResult> target_element,
+      bool is_a_click,
+      base::OnceCallback<void(const ClientStatus&)> callback);
   void OnScrollIntoView(std::unique_ptr<FindElementResult> target_element,
-                        base::OnceCallback<void(bool)> callback,
+                        base::OnceCallback<void(const ClientStatus&)> callback,
                         bool is_a_click,
                         std::unique_ptr<runtime::CallFunctionOnResult> result);
-  void TapOrClickOnCoordinates(ElementPositionGetter* getter_to_release,
-                               base::OnceCallback<void(bool)> callback,
-                               bool is_a_click,
-                               bool has_coordinates,
-                               int x,
-                               int y);
+  void TapOrClickOnCoordinates(
+      ElementPositionGetter* getter_to_release,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      bool is_a_click,
+      bool has_coordinates,
+      int x,
+      int y);
   void OnDispatchPressMouseEvent(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       int x,
       int y,
       std::unique_ptr<input::DispatchMouseEventResult> result);
   void OnDispatchReleaseMouseEvent(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<input::DispatchMouseEventResult> result);
   void OnDispatchTouchEventStart(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<input::DispatchTouchEventResult> result);
   void OnDispatchTouchEventEnd(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<input::DispatchTouchEventResult> result);
   void OnFindElementForCheck(ElementCheckType check_type,
                              base::OnceCallback<void(bool)> callback,
+                             const ClientStatus& status,
                              std::unique_ptr<FindElementResult> result);
   void OnGetBoxModelForVisible(base::OnceCallback<void(bool)> callback,
                                std::unique_ptr<dom::GetBoxModelResult> result);
@@ -285,97 +304,108 @@
                    FindElementCallback callback);
   void OnFindElementResult(ElementFinder* finder_to_release,
                            FindElementCallback callback,
+                           const ClientStatus& status,
                            std::unique_ptr<FindElementResult> result);
-  void OnResult(bool result, base::OnceCallback<void(bool)> callback);
-  void OnResult(bool exists,
-                const std::string& result,
-                base::OnceCallback<void(bool, const std::string&)> callback);
   void OnFindElementForFillingForm(
       std::unique_ptr<FillFormInputData> data_to_autofill,
       const Selector& selector,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnGetFormAndFieldDataForFillingForm(
       std::unique_ptr<FillFormInputData> data_to_autofill,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       content::RenderFrameHost* container_frame_host,
       const autofill::FormData& form_data,
       const autofill::FormFieldData& form_field);
   void OnFindElementForFocusElement(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnWaitDocumentToBecomeInteractiveForFocusElement(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<FindElementResult> target_element,
       bool result);
-  void OnFocusElement(base::OnceCallback<void(bool)> callback,
+  void OnFocusElement(base::OnceCallback<void(const ClientStatus&)> callback,
                       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForSelectOption(
       const std::string& selected_option,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
-  void OnSelectOption(base::OnceCallback<void(bool)> callback,
+  void OnSelectOption(base::OnceCallback<void(const ClientStatus&)> callback,
                       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForHighlightElement(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnHighlightElement(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForGetFieldValue(
       base::OnceCallback<void(bool, const std::string&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnGetValueAttribute(
       base::OnceCallback<void(bool, const std::string&)> callback,
       std::unique_ptr<runtime::CallFunctionOnResult> result);
-  void InternalSetFieldValue(const Selector& selector,
-                             const std::string& value,
-                             base::OnceCallback<void(bool)> callback);
+  void InternalSetFieldValue(
+      const Selector& selector,
+      const std::string& value,
+      base::OnceCallback<void(const ClientStatus&)> callback);
   void OnClearFieldForSendKeyboardInput(
       const Selector& selector,
       const std::vector<std::string>& utf8_chars,
-      base::OnceCallback<void(bool)> callback,
-      bool clear_status);
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status);
   void OnClickElementForSendKeyboardInput(
       const std::vector<std::string>& utf8_chars,
-      base::OnceCallback<void(bool)> callback,
-      bool click_status);
-  void DispatchKeyboardTextDownEvent(const std::vector<std::string>& utf8_chars,
-                                     size_t index,
-                                     base::OnceCallback<void(bool)> callback);
-  void DispatchKeyboardTextUpEvent(const std::vector<std::string>& utf8_chars,
-                                   size_t index,
-                                   base::OnceCallback<void(bool)> callback);
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& click_status);
+  void DispatchKeyboardTextDownEvent(
+      const std::vector<std::string>& utf8_chars,
+      size_t index,
+      base::OnceCallback<void(const ClientStatus&)> callback);
+  void DispatchKeyboardTextUpEvent(
+      const std::vector<std::string>& utf8_chars,
+      size_t index,
+      base::OnceCallback<void(const ClientStatus&)> callback);
   void OnFindElementForSetAttribute(
       const std::vector<std::string>& attribute,
       const std::string& value,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
-  void OnSetAttribute(base::OnceCallback<void(bool)> callback,
+  void OnSetAttribute(base::OnceCallback<void(const ClientStatus&)> callback,
                       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForSendKeyboardInput(
       const Selector& selector,
       const std::vector<std::string>& utf8_chars,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnPressKeyboard(int key_code,
                        base::OnceCallback<void(bool)> callback,
                        std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForSetFieldValue(
       const std::string& value,
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
   void OnSetValueAttribute(
-      base::OnceCallback<void(bool)> callback,
+      base::OnceCallback<void(const ClientStatus&)> callback,
       std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForGetOuterHtml(
-      base::OnceCallback<void(bool, const std::string&)> callback,
+      base::OnceCallback<void(const ClientStatus&, const std::string&)>
+          callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> element_result);
-  void OnGetOuterHtml(
-      base::OnceCallback<void(bool, const std::string&)> callback,
-      std::unique_ptr<runtime::CallFunctionOnResult> result);
+  void OnGetOuterHtml(base::OnceCallback<void(const ClientStatus&,
+                                              const std::string&)> callback,
+                      std::unique_ptr<runtime::CallFunctionOnResult> result);
   void OnFindElementForPosition(
       base::OnceCallback<void(bool, const RectF&)> callback,
+      const ClientStatus& status,
       std::unique_ptr<FindElementResult> result);
   void OnGetElementPositionResult(
       base::OnceCallback<void(bool, const RectF&)> callback,
diff --git a/components/autofill_assistant/browser/web_controller_browsertest.cc b/components/autofill_assistant/browser/web_controller_browsertest.cc
index 078adf3..bb46c82 100644
--- a/components/autofill_assistant/browser/web_controller_browsertest.cc
+++ b/components/autofill_assistant/browser/web_controller_browsertest.cc
@@ -103,8 +103,8 @@
   }
 
   void ClickElementCallback(const base::Closure& done_callback,
-                            bool result) {
-    ASSERT_TRUE(result);
+                            const ClientStatus& status) {
+    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
     done_callback.Run();
   }
 
@@ -150,14 +150,16 @@
     run_loop.Run();
   }
 
-  void OnFocusElement(base::Closure done_callback, bool result) {
-    ASSERT_TRUE(result);
+  void OnFocusElement(base::OnceClosure done_callback,
+                      const ClientStatus& status) {
+    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
     std::move(done_callback).Run();
   }
 
-  bool SelectOption(const Selector& selector, const std::string& option) {
+  ClientStatus SelectOption(const Selector& selector,
+                            const std::string& option) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->SelectOption(
         selector, option,
         base::BindOnce(&WebControllerBrowserTest::OnSelectOption,
@@ -168,15 +170,15 @@
   }
 
   void OnSelectOption(base::Closure done_callback,
-                      bool* result_output,
-                      bool result) {
-    *result_output = result;
+                      ClientStatus* result_output,
+                      const ClientStatus& status) {
+    *result_output = status;
     std::move(done_callback).Run();
   }
 
-  bool HighlightElement(const Selector& selector) {
+  ClientStatus HighlightElement(const Selector& selector) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->HighlightElement(
         selector, base::BindOnce(&WebControllerBrowserTest::OnHighlightElement,
                                  base::Unretained(this), run_loop.QuitClosure(),
@@ -186,15 +188,16 @@
   }
 
   void OnHighlightElement(base::Closure done_callback,
-                          bool* result_output,
-                          bool result) {
-    *result_output = result;
+                          ClientStatus* result_output,
+                          const ClientStatus& status) {
+    *result_output = status;
     std::move(done_callback).Run();
   }
 
-  bool GetOuterHtml(const Selector& selector, std::string* html_output) {
+  ClientStatus GetOuterHtml(const Selector& selector,
+                            std::string* html_output) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->GetOuterHtml(
         selector, base::BindOnce(&WebControllerBrowserTest::OnGetOuterHtml,
                                  base::Unretained(this), run_loop.QuitClosure(),
@@ -204,11 +207,12 @@
   }
 
   void OnGetOuterHtml(const base::Closure& done_callback,
-                      bool* successful_output,
+                      ClientStatus* successful_output,
                       std::string* html_output,
-                      bool successful,
+                      const ClientStatus& status,
                       const std::string& html) {
-    *successful_output = successful;
+    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
+    *successful_output = status;
     *html_output = html;
     done_callback.Run();
   }
@@ -229,17 +233,19 @@
   void OnFindElement(const base::Closure& done_callback,
                      size_t expected_index,
                      bool is_main_frame,
+                     const ClientStatus& status,
                      std::unique_ptr<WebController::FindElementResult> result) {
     done_callback.Run();
+    EXPECT_EQ(ACTION_APPLIED, status.proto_status());
     if (is_main_frame) {
-      ASSERT_EQ(shell()->web_contents()->GetMainFrame(),
+      EXPECT_EQ(shell()->web_contents()->GetMainFrame(),
                 result->container_frame_host);
     } else {
-      ASSERT_NE(shell()->web_contents()->GetMainFrame(),
+      EXPECT_NE(shell()->web_contents()->GetMainFrame(),
                 result->container_frame_host);
     }
-    ASSERT_EQ(result->container_frame_selector_index, expected_index);
-    ASSERT_FALSE(result->object_id.empty());
+    EXPECT_EQ(result->container_frame_selector_index, expected_index);
+    EXPECT_FALSE(result->object_id.empty());
   }
 
   void GetFieldsValue(const std::vector<Selector>& selectors,
@@ -271,11 +277,11 @@
     }
   }
 
-  bool SetFieldValue(const Selector& selector,
-                     const std::string& value,
-                     bool simulate_key_presses) {
+  ClientStatus SetFieldValue(const Selector& selector,
+                             const std::string& value,
+                             bool simulate_key_presses) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->SetFieldValue(
         selector, value, simulate_key_presses,
         base::BindOnce(&WebControllerBrowserTest::OnSetFieldValue,
@@ -286,16 +292,16 @@
   }
 
   void OnSetFieldValue(const base::Closure& done_callback,
-                       bool* result_output,
-                       bool result) {
-    *result_output = result;
+                       ClientStatus* result_output,
+                       const ClientStatus& status) {
+    *result_output = status;
     std::move(done_callback).Run();
   }
 
-  bool SendKeyboardInput(const Selector& selector,
-                         const std::vector<std::string>& text_parts) {
+  ClientStatus SendKeyboardInput(const Selector& selector,
+                                 const std::vector<std::string>& text_parts) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->SendKeyboardInput(
         selector, text_parts,
         base::BindOnce(&WebControllerBrowserTest::OnSendKeyboardInput,
@@ -306,17 +312,17 @@
   }
 
   void OnSendKeyboardInput(const base::Closure& done_callback,
-                           bool* result_output,
-                           bool result) {
-    *result_output = result;
+                           ClientStatus* result_output,
+                           const ClientStatus& status) {
+    *result_output = status;
     std::move(done_callback).Run();
   }
 
-  bool SetAttribute(const Selector& selector,
-                    const std::vector<std::string>& attribute,
-                    const std::string& value) {
+  ClientStatus SetAttribute(const Selector& selector,
+                            const std::vector<std::string>& attribute,
+                            const std::string& value) {
     base::RunLoop run_loop;
-    bool result;
+    ClientStatus result;
     web_controller_->SetAttribute(
         selector, attribute, value,
         base::BindOnce(&WebControllerBrowserTest::OnSetAttribute,
@@ -327,9 +333,9 @@
   }
 
   void OnSetAttribute(const base::Closure& done_callback,
-                      bool* result_output,
-                      bool result) {
-    *result_output = result;
+                      ClientStatus* result_output,
+                      const ClientStatus& status) {
+    *result_output = status;
     std::move(done_callback).Run();
   }
 
@@ -610,8 +616,9 @@
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, SelectOption) {
   Selector selector;
   selector.selectors.emplace_back("#select");
-  EXPECT_FALSE(SelectOption(selector, "incorrect_label"));
-  ASSERT_TRUE(SelectOption(selector, "two"));
+  EXPECT_EQ(OTHER_ACTION_STATUS,
+            SelectOption(selector, "incorrect_label").proto_status());
+  EXPECT_EQ(ACTION_APPLIED, SelectOption(selector, "two").proto_status());
 
   const std::string javascript = R"(
     let select = document.querySelector("#select");
@@ -619,19 +626,20 @@
   )";
   EXPECT_EQ("Two", content::EvalJs(shell(), javascript));
 
-  ASSERT_TRUE(SelectOption(selector, "one"));
+  EXPECT_EQ(ACTION_APPLIED, SelectOption(selector, "one").proto_status());
   EXPECT_EQ("One", content::EvalJs(shell(), javascript));
 
   selector.selectors.clear();
   selector.selectors.emplace_back("#incorrect_selector");
-  EXPECT_FALSE(SelectOption(selector, "two"));
+  EXPECT_EQ(ELEMENT_RESOLUTION_FAILED,
+            SelectOption(selector, "two").proto_status());
 }
 
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, SelectOptionInIframe) {
   Selector selector;
   selector.selectors.emplace_back("#iframe");
   selector.selectors.emplace_back("select[name=state]");
-  ASSERT_TRUE(SelectOption(selector, "NY"));
+  EXPECT_EQ(ACTION_APPLIED, SelectOption(selector, "NY").proto_status());
 
   const std::string javascript = R"(
     let iframe = document.querySelector("iframe").contentDocument;
@@ -645,7 +653,7 @@
   Selector selector;
   selector.selectors.emplace_back("#testOuterHtml");
   std::string html;
-  ASSERT_TRUE(GetOuterHtml(selector, &html));
+  ASSERT_EQ(ACTION_APPLIED, GetOuterHtml(selector, &html).proto_status());
   EXPECT_EQ(
       R"(<div id="testOuterHtml"><span>Span</span><p>Paragraph</p></div>)",
       html);
@@ -661,8 +669,9 @@
   expected_values.emplace_back("helloworld1");
   GetFieldsValue(selectors, expected_values);
 
-  EXPECT_TRUE(
-      SetFieldValue(a_selector, "foo", /* simulate_key_presses= */ false));
+  EXPECT_EQ(ACTION_APPLIED,
+            SetFieldValue(a_selector, "foo", /* simulate_key_presses= */ false)
+                .proto_status());
   expected_values.clear();
   expected_values.emplace_back("foo");
   GetFieldsValue(selectors, expected_values);
@@ -671,8 +680,10 @@
   a_selector.selectors.clear();
   a_selector.selectors.emplace_back("#uppercase_input");
   selectors.emplace_back(a_selector);
-  EXPECT_TRUE(SetFieldValue(a_selector, /* Zürich */ "Z\xc3\xbcrich",
-                            /* simulate_key_presses= */ true));
+  EXPECT_EQ(ACTION_APPLIED,
+            SetFieldValue(a_selector, /* Zürich */ "Z\xc3\xbcrich",
+                          /* simulate_key_presses= */ true)
+                .proto_status());
   expected_values.clear();
   expected_values.emplace_back(/* ZÜRICH */ "Z\xc3\x9cRICH");
   GetFieldsValue(selectors, expected_values);
@@ -685,8 +696,10 @@
   expected_values.emplace_back("");
   GetFieldsValue(selectors, expected_values);
 
-  EXPECT_FALSE(
-      SetFieldValue(a_selector, "foobar", /* simulate_key_presses= */ false));
+  EXPECT_EQ(
+      ELEMENT_RESOLUTION_FAILED,
+      SetFieldValue(a_selector, "foobar", /* simulate_key_presses= */ false)
+          .proto_status());
 }
 
 IN_PROC_BROWSER_TEST_F(WebControllerBrowserTest, SendKeyboardInput) {
@@ -698,7 +711,8 @@
   Selector a_selector;
   a_selector.selectors.emplace_back("#input6");
   selectors.emplace_back(a_selector);
-  EXPECT_TRUE(SendKeyboardInput(a_selector, text_parts));
+  EXPECT_EQ(ACTION_APPLIED,
+            SendKeyboardInput(a_selector, text_parts).proto_status());
   GetFieldsValue(selectors, expected_values);
 }
 
@@ -711,7 +725,8 @@
   attribute.emplace_back("backgroundColor");
   std::string value = "red";
 
-  EXPECT_TRUE(SetAttribute(selector, attribute, value));
+  EXPECT_EQ(ACTION_APPLIED,
+            SetAttribute(selector, attribute, value).proto_status());
   const std::string javascript = R"(
     document.querySelector("#full_height_section").style.backgroundColor;
   )";
@@ -768,7 +783,7 @@
     select.style.boxShadow;
   )";
   EXPECT_EQ("", content::EvalJs(shell(), javascript));
-  ASSERT_TRUE(HighlightElement(selector));
+  EXPECT_EQ(ACTION_APPLIED, HighlightElement(selector).proto_status());
   // We only make sure that the element has a non-empty boxShadow style without
   // requiring an exact string match.
   EXPECT_NE("", content::EvalJs(shell(), javascript));
diff --git a/components/favicon/core/large_icon_service.h b/components/favicon/core/large_icon_service.h
index 46fe898..0843935 100644
--- a/components/favicon/core/large_icon_service.h
+++ b/components/favicon/core/large_icon_service.h
@@ -48,8 +48,8 @@
       const favicon_base::LargeIconCallback& callback,
       base::CancelableTaskTracker* tracker) = 0;
 
-  // Behaves the same as GetLargeIconOrFallbackStyle(), only returns the large
-  // icon (if available) decoded.
+  // Behaves the same as GetLargeIconOrFallbackStyleForPageUrl(), only returns
+  // the large icon (if available) decoded.
   virtual base::CancelableTaskTracker::TaskId
   GetLargeIconImageOrFallbackStyleForPageUrl(
       const GURL& page_url,
@@ -58,6 +58,16 @@
       const favicon_base::LargeIconImageCallback& callback,
       base::CancelableTaskTracker* tracker) = 0;
 
+  // Behaves the same as GetLargeIconRawBitmapOrFallbackStyleForPageUrl, except
+  // uses icon URL instead of page URL.
+  virtual base::CancelableTaskTracker::TaskId
+  GetLargeIconRawBitmapOrFallbackStyleForIconUrl(
+      const GURL& icon_url,
+      int min_source_size_in_pixel,
+      int desired_size_in_pixel,
+      const favicon_base::LargeIconCallback& callback,
+      base::CancelableTaskTracker* tracker) = 0;
+
   // Fetches the best large icon for the page at |page_url| from a Google
   // favicon server and stores the result in the FaviconService database
   // (implemented in HistoryService). The write will be a no-op if the local
diff --git a/components/favicon/core/large_icon_service_impl.cc b/components/favicon/core/large_icon_service_impl.cc
index 54244ef..637feb9f 100644
--- a/components/favicon/core/large_icon_service_impl.cc
+++ b/components/favicon/core/large_icon_service_impl.cc
@@ -343,9 +343,9 @@
 LargeIconWorker::~LargeIconWorker() {}
 
 void LargeIconWorker::OnIconLookupComplete(
-    const GURL& page_url,
+    const GURL& page_url_for_uma,
     const favicon_base::FaviconRawBitmapResult& db_result) {
-  LogSuspiciousURLMismatches(page_url, db_result);
+  LogSuspiciousURLMismatches(page_url_for_uma, db_result);
   tracker_->PostTaskAndReply(
       background_task_runner_.get(), FROM_HERE,
       base::BindOnce(&ProcessIconOnBackgroundThread, db_result,
@@ -380,11 +380,11 @@
 }
 
 void LargeIconWorker::LogSuspiciousURLMismatches(
-    const GURL& page_url,
+    const GURL& page_url_for_uma,
     const favicon_base::FaviconRawBitmapResult& db_result) {
   const int page_organization_id =
       DomainToOrganizationIdMap::GetInstance()->GetCanonicalOrganizationId(
-          page_url);
+          page_url_for_uma);
 
   // Ignore trivial cases.
   if (!db_result.is_valid() || page_organization_id == kInvalidOrganizationId)
@@ -492,6 +492,29 @@
       favicon_base::LargeIconCallback(), image_callback, tracker);
 }
 
+base::CancelableTaskTracker::TaskId
+LargeIconServiceImpl::GetLargeIconRawBitmapOrFallbackStyleForIconUrl(
+    const GURL& icon_url,
+    int min_source_size_in_pixel,
+    int desired_size_in_pixel,
+    const favicon_base::LargeIconCallback& raw_bitmap_callback,
+    base::CancelableTaskTracker* tracker) {
+  DCHECK_LE(1, min_source_size_in_pixel);
+  DCHECK_LE(0, desired_size_in_pixel);
+
+  scoped_refptr<LargeIconWorker> worker = base::MakeRefCounted<LargeIconWorker>(
+      min_source_size_in_pixel, desired_size_in_pixel, raw_bitmap_callback,
+      favicon_base::LargeIconImageCallback(), tracker);
+
+  int max_size_in_pixel =
+      std::max(desired_size_in_pixel, min_source_size_in_pixel);
+  return favicon_service_->GetRawFavicon(
+      icon_url, favicon_base::IconType::kFavicon, max_size_in_pixel,
+      base::BindRepeating(&LargeIconWorker::OnIconLookupComplete, worker,
+                          /*page_url_for_uma=*/GURL()),
+      tracker);
+}
+
 void LargeIconServiceImpl::
     GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
         std::unique_ptr<FaviconServerFetcherParams> params,
diff --git a/components/favicon/core/large_icon_service_impl.h b/components/favicon/core/large_icon_service_impl.h
index 934e942..e9fceb0 100644
--- a/components/favicon/core/large_icon_service_impl.h
+++ b/components/favicon/core/large_icon_service_impl.h
@@ -50,6 +50,13 @@
       int desired_size_in_pixel,
       const favicon_base::LargeIconImageCallback& callback,
       base::CancelableTaskTracker* tracker) override;
+  base::CancelableTaskTracker::TaskId
+  GetLargeIconRawBitmapOrFallbackStyleForIconUrl(
+      const GURL& icon_url,
+      int min_source_size_in_pixel,
+      int desired_size_in_pixel,
+      const favicon_base::LargeIconCallback& callback,
+      base::CancelableTaskTracker* tracker) override;
   void GetLargeIconOrFallbackStyleFromGoogleServerSkippingLocalCache(
       std::unique_ptr<FaviconServerFetcherParams> params,
       bool may_page_url_be_private,
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.cc b/components/password_manager/core/browser/sync/password_syncable_service.cc
index 6765684..56f8ac8 100644
--- a/components/password_manager/core/browser/sync/password_syncable_service.cc
+++ b/components/password_manager/core/browser/sync/password_syncable_service.cc
@@ -130,6 +130,11 @@
 
 PasswordSyncableService::~PasswordSyncableService() = default;
 
+void PasswordSyncableService::WaitUntilReadyToSync(base::OnceClosure done) {
+  // PasswordStore becomes ready upon construction.
+  std::move(done).Run();
+}
+
 syncer::SyncMergeResult PasswordSyncableService::MergeDataAndStartSyncing(
     syncer::ModelType type,
     const syncer::SyncDataList& initial_sync_data,
diff --git a/components/password_manager/core/browser/sync/password_syncable_service.h b/components/password_manager/core/browser/sync/password_syncable_service.h
index 567d4f7..c296b604b 100644
--- a/components/password_manager/core/browser/sync/password_syncable_service.h
+++ b/components/password_manager/core/browser/sync/password_syncable_service.h
@@ -5,6 +5,7 @@
 #ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
 #define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_SYNCABLE_SERVICE_H_
 
+#include <map>
 #include <memory>
 #include <string>
 #include <vector>
@@ -41,6 +42,7 @@
   ~PasswordSyncableService() override;
 
   // syncer::SyncableService:
+  void WaitUntilReadyToSync(base::OnceClosure done) override;
   syncer::SyncMergeResult MergeDataAndStartSyncing(
       syncer::ModelType type,
       const syncer::SyncDataList& initial_sync_data,
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto
index 4db3e21b2..d7698eb 100644
--- a/components/policy/proto/chrome_device_policy.proto
+++ b/components/policy/proto/chrome_device_policy.proto
@@ -855,11 +855,11 @@
   optional int32 download_rate_kbits = 3 [default = 0];
 }
 
-// A list of apps to install from the webstore on the login page. It is a list
-// of strings, each string contains an extension ID and an update URL, delimited
-// by a semicolon.
-message DeviceLoginScreenAppInstallListProto {
-  repeated string device_login_screen_app_install_list = 1;
+// A list of apps or extensions to install from the webstore on the login page.
+// It is a list of strings, each string contains an extension ID and an update
+// URL, delimited by a semicolon.
+message DeviceLoginScreenExtensionsProto {
+  repeated string device_login_screen_extensions = 1;
 }
 
 // A list of allowed locales on the login screen.
@@ -1261,8 +1261,7 @@
   optional DeviceQuirksDownloadEnabledProto quirks_download_enabled = 44;
   optional LoginVideoCaptureAllowedUrlsProto login_video_capture_allowed_urls =
       45;
-  optional DeviceLoginScreenAppInstallListProto
-      device_login_screen_app_install_list = 46;
+  optional DeviceLoginScreenExtensionsProto device_login_screen_extensions = 46;
   optional NetworkThrottlingEnabledProto network_throttling = 47;
   optional DeviceWallpaperImageProto device_wallpaper_image = 48;
   optional LoginScreenLocalesProto login_screen_locales = 49;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 3dd97a5..ebf6fdf 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -756,7 +756,7 @@
         'DeviceTransferSAMLCookies',
         'LoginVideoCaptureAllowedUrls',
         'DeviceStartUpFlags',
-        'DeviceLoginScreenAppInstallList',
+        'DeviceLoginScreenExtensions',
         'DeviceLoginScreenLocales',
         'DeviceLoginScreenInputMethods',
         'DeviceSecondFactorAuthentication',
@@ -1011,6 +1011,8 @@
 
           Leaving this policy not set will allow the user to choose their home page on their own if HomepageIsNewTabPage is not set too.
 
+          The URL must have a standard scheme, e.g. "http://example.com" or "https://example.com".
+
           This policy is available only on Windows instances that are joined to a <ph name="MS_AD_NAME">Microsoft® Active Directory®</ph> domain. or Windows 10 Pro or Enterprise instances that enrolled for device management.''',
       'label': '''Home page URL''',
     },
@@ -8256,7 +8258,9 @@
 
           When this policy is unset, no warning dialog is shown.
 
-          The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.''',
+          The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+
+          The warning message is only shown if the idle action is to logout or shut down.''',
     },
     {
       'name': 'IdleDelayAC',
@@ -8389,7 +8393,9 @@
 
           When this policy is unset, no warning dialog is shown.
 
-          The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.''',
+          The policy value should be specified in milliseconds. Values are clamped to be less than or equal the idle delay.
+
+          The warning message is only shown if the idle action is to logout or shut down.''',
     },
     {
       'name': 'IdleDelayBattery',
@@ -8825,7 +8831,7 @@
           There are four types of action:
           * The screen will be dimmed if the user remains idle for the time specified by |ScreenDim|.
           * The screen will be turned off if the user remains idle for the time specified by |ScreenOff|.
-          * A warning dialog will be shown if the user remains idle for the time specified by |IdleWarning|, telling the user that the idle action is about to be taken.
+          * A warning dialog will be shown if the user remains idle for the time specified by |IdleWarning|, telling the user that the idle action is about to be taken. The warning message is only shown if the idle action is to logout or shut down.
           * The action specified by |IdleAction| will be taken if the user remains idle for the time specified by |Idle|.
 
           For each of above actions, the delay should be specified in milliseconds, and needs to be set to a value greater than zero to trigger the corresponding action. In case the delay is set to zero, <ph name="PRODUCT_OS_NAME">$2<ex>Google Chrome OS</ex></ph> will not take the corresponding action.
@@ -11033,7 +11039,7 @@
       allowed.'''
     },
     {
-      'name': 'DeviceLoginScreenAppInstallList',
+      'name': 'DeviceLoginScreenExtensions',
       'type': 'list',
       'schema': {
         'type': 'array',
@@ -13321,7 +13327,7 @@
 
       When this policy is unset or set to Default (value 0), the behavior of SAML logins is determined by the browser depending on other factors. In the most basic scenario, the user authentication and the protection of the cached user data are based on passwords manually entered by users.
 
-      When this policy is set to ClientCertificate (value 1), client certificate authentication is used for newly added users which log in via SAML. No passwords are used for such users, and their cached local data is protected using corresponding cryptographic keys. For instance, this setting allows configuring smart card based user authentication (note that smart card middleware apps have to be installed via the DeviceLoginScreenAppInstallList policy).
+      When this policy is set to ClientCertificate (value 1), client certificate authentication is used for newly added users which log in via SAML. No passwords are used for such users, and their cached local data is protected using corresponding cryptographic keys. For instance, this setting allows configuring smart card based user authentication (note that smart card middleware apps have to be installed via the DeviceLoginScreenExtensions policy).
 
       This policy affects only users who authenticate using SAML.''',
     },
@@ -14960,7 +14966,7 @@
       'device_only': True,
       'example_value': 2,
       'features': {
-        'dynamic_refresh': True,
+        'dynamic_refresh': False,
         'per_profile': False,
       },
       'supported_on': ['chrome_os:74-'],
diff --git a/components/policy_strings.grdp b/components/policy_strings.grdp
index 753b0de..0dd980a 100644
--- a/components/policy_strings.grdp
+++ b/components/policy_strings.grdp
@@ -183,7 +183,7 @@
     This computer is not detected as enterprise managed so policy can only automatically install extensions hosted on the Chrome Webstore. The Chrome Webstore update URL is "<ph name="CWS_UPDATE_URL">$1<ex>https://clients2.google.com/service/update2/crx</ex></ph>".
   </message>
   <message name="IDS_POLICY_HOMEPAGE_LOCATION_ERROR" desc="The text displayed in the status column when the homepage URL given by the HomepageLocation policy is invalid.">
-    Invalid URL. Must be a URL with a standard scheme.
+    Invalid URL. Must be a URL with a standard scheme, e.g http://example.com or https://example.com.
   </message>
   <message name="IDS_POLICY_PROXY_MODE_DISABLED_ERROR" desc="The text displayed in the status column when use of a proxy is disabled but a proxy configuration is given.">
     Use of a proxy is disabled but an explicit proxy configuration is specified.
diff --git a/components/signin/core/browser/account_fetcher_service.h b/components/signin/core/browser/account_fetcher_service.h
index 621c0a1..7d2d6302 100644
--- a/components/signin/core/browser/account_fetcher_service.h
+++ b/components/signin/core/browser/account_fetcher_service.h
@@ -38,8 +38,7 @@
 class ImageFetcherImpl;
 }  // namespace image_fetcher
 
-class AccountFetcherService : public KeyedService,
-                              public OAuth2TokenService::Observer {
+class AccountFetcherService : public OAuth2TokenService::Observer {
  public:
   // Name of the preference that tracks the int64_t representation of the last
   // time the AccountTrackerService was updated.
@@ -59,8 +58,7 @@
                   AccountTrackerService* account_tracker_service,
                   std::unique_ptr<image_fetcher::ImageDecoder> image_decoder);
 
-  // KeyedService implementation
-  void Shutdown() override;
+  void Shutdown();
 
   // Indicates if all user information has been fetched. If the result is false,
   // there are still unfininshed fetchers.
diff --git a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
index 4e0be16d..253c7db 100644
--- a/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
+++ b/content/browser/accessibility/browser_accessibility_manager_auralinux.cc
@@ -138,11 +138,15 @@
     case ui::AXEventGenerator::Event::COLLAPSED:
       FireExpandedEvent(node, false);
       break;
+    case ui::AXEventGenerator::Event::DOCUMENT_TITLE_CHANGED:
+      FireEvent(node, ax::mojom::Event::kDocumentTitleChanged);
+      break;
     case ui::AXEventGenerator::Event::EXPANDED:
       FireExpandedEvent(node, true);
       break;
     case ui::AXEventGenerator::Event::LOAD_COMPLETE:
       FireLoadingEvent(node, false);
+      FireEvent(node, ax::mojom::Event::kLoadComplete);
       break;
     case ui::AXEventGenerator::Event::LOAD_START:
       FireLoadingEvent(node, true);
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index e5f5be5..cb0b5f8a 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -481,6 +481,11 @@
 }
 
 IN_PROC_BROWSER_TEST_F(DumpAccessibilityEventsTest,
+                       AccessibilityEventsDocumentTitleChange) {
+  RunEventTest(FILE_PATH_LITERAL("document-title-change.html"));
+}
+
+IN_PROC_BROWSER_TEST_F(DumpAccessibilityEventsTest,
                        AccessibilityEventsRemoveChild) {
   RunEventTest(FILE_PATH_LITERAL("remove-child.html"));
 }
diff --git a/content/browser/bad_message.h b/content/browser/bad_message.h
index 1771e0a..f31146d 100644
--- a/content/browser/bad_message.h
+++ b/content/browser/bad_message.h
@@ -240,6 +240,7 @@
   RFPH_POST_MESSAGE_INVALID_SOURCE_ORIGIN = 212,
   INVALID_INITIATOR_ORIGIN = 213,
   RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN = 214,
+  RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION = 215,
 
   // Please add new elements here. The naming convention is abbreviated class
   // name (e.g. RenderFrameHost becomes RFH) plus a unique description of the
diff --git a/content/browser/browser_thread_impl.cc b/content/browser/browser_thread_impl.cc
index ee52d18..40fd3dcd 100644
--- a/content/browser/browser_thread_impl.cc
+++ b/content/browser/browser_thread_impl.cc
@@ -21,6 +21,7 @@
 #include "base/threading/platform_thread.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
+#include "content/browser/scheduler/browser_task_executor.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/content_browser_client.h"
 
@@ -254,4 +255,9 @@
   return globals.task_runners[identifier];
 }
 
+// static
+void BrowserThread::RunAllPendingTasksOnThreadForTesting(ID identifier) {
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(identifier);
+}
+
 }  // namespace content
diff --git a/content/browser/browser_thread_unittest.cc b/content/browser/browser_thread_unittest.cc
index 7b44ad6..7763d782 100644
--- a/content/browser/browser_thread_unittest.cc
+++ b/content/browser/browser_thread_unittest.cc
@@ -40,7 +40,9 @@
     sequence_manager_->SetDefaultTaskRunner(default_task_runner_);
   }
 
-  ~SequenceManagerTaskEnvironment() override {}
+  ~SequenceManagerTaskEnvironment() override {
+    BrowserTaskExecutor::ResetForTesting();
+  }
 
   // Thread::TaskEnvironment:
   scoped_refptr<base::SingleThreadTaskRunner> GetDefaultTaskRunner() override {
@@ -111,7 +113,6 @@
 
     BrowserThreadImpl::ResetGlobalsForTesting(BrowserThread::UI);
     BrowserThreadImpl::ResetGlobalsForTesting(BrowserThread::IO);
-    BrowserTaskExecutor::ResetForTesting();
   }
 
   // Prepares this BrowserThreadTest for Release() to be invoked. |on_release|
diff --git a/content/browser/frame_host/ipc_utils.cc b/content/browser/frame_host/ipc_utils.cc
index 69c6f22..6df639d 100644
--- a/content/browser/frame_host/ipc_utils.cc
+++ b/content/browser/frame_host/ipc_utils.cc
@@ -157,6 +157,13 @@
     return false;
   }
 
+  // Verify |transition| is webby.
+  if (!PageTransitionIsWebTriggerable(common_params->transition)) {
+    bad_message::ReceivedBadMessage(
+        process, bad_message::RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION);
+    return false;
+  }
+
   // Verify |initiator_origin|.
   if (!common_params->initiator_origin.has_value()) {
     bad_message::ReceivedBadMessage(
diff --git a/content/browser/frame_host/navigation_handle_impl.cc b/content/browser/frame_host/navigation_handle_impl.cc
index 76c0dac..f454a8a 100644
--- a/content/browser/frame_host/navigation_handle_impl.cc
+++ b/content/browser/frame_host/navigation_handle_impl.cc
@@ -133,7 +133,6 @@
       should_update_history_(false),
       subframe_entry_committed_(false),
       request_headers_(std::move(request_headers)),
-      state_(NavigationRequest::INITIAL),
       pending_nav_entry_id_(pending_nav_entry_id),
       navigation_ui_data_(std::move(navigation_ui_data)),
       navigation_id_(CreateUniqueHandleID()),
@@ -316,17 +315,7 @@
 }
 
 RenderFrameHostImpl* NavigationHandleImpl::GetRenderFrameHost() {
-  // Only allow the RenderFrameHost to be retrieved once it has been set for
-  // this navigation.  This will happens either at WillProcessResponse time for
-  // regular navigations or at WillFailRequest time for error pages.
-  CHECK_GE(state_, NavigationRequest::PROCESSING_WILL_FAIL_REQUEST)
-      << "This accessor should only be called after a RenderFrameHost has been "
-         "picked for this navigation.";
-  static_assert(NavigationRequest::WILL_FAIL_REQUEST <
-                    NavigationRequest::WILL_PROCESS_RESPONSE,
-                "WillFailRequest state should come before WillProcessResponse");
   return navigation_request_->render_frame_host();
-  ;
 }
 
 bool NavigationHandleImpl::IsSameDocument() {
@@ -338,18 +327,18 @@
 }
 
 void NavigationHandleImpl::RemoveRequestHeader(const std::string& header_name) {
-  DCHECK(state_ == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
-         state_ == NavigationRequest::WILL_REDIRECT_REQUEST);
+  DCHECK(state() == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
+         state() == NavigationRequest::WILL_REDIRECT_REQUEST);
   removed_request_headers_.push_back(header_name);
 }
 
 void NavigationHandleImpl::SetRequestHeader(const std::string& header_name,
                                             const std::string& header_value) {
-  DCHECK(state_ == NavigationRequest::INITIAL ||
-         state_ == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
-         state_ == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
-         state_ == NavigationRequest::WILL_START_REQUEST ||
-         state_ == NavigationRequest::WILL_REDIRECT_REQUEST);
+  DCHECK(state() == NavigationRequest::INITIAL ||
+         state() == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
+         state() == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
+         state() == NavigationRequest::WILL_START_REQUEST ||
+         state() == NavigationRequest::WILL_REDIRECT_REQUEST);
   modified_request_headers_.SetHeader(header_name, header_value);
 }
 
@@ -373,40 +362,40 @@
 }
 
 bool NavigationHandleImpl::IsWaitingToCommit() {
-  return state_ == NavigationRequest::READY_TO_COMMIT;
+  return state() == NavigationRequest::READY_TO_COMMIT;
 }
 
 bool NavigationHandleImpl::HasCommitted() {
-  return state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE;
+  return state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE;
 }
 
 bool NavigationHandleImpl::IsErrorPage() {
-  return state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE;
+  return state() == NavigationRequest::DID_COMMIT_ERROR_PAGE;
 }
 
 bool NavigationHandleImpl::HasSubframeNavigationEntryCommitted() {
   DCHECK(!IsInMainFrame());
-  DCHECK(state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE);
+  DCHECK(state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE);
   return subframe_entry_committed_;
 }
 
 bool NavigationHandleImpl::DidReplaceEntry() {
-  DCHECK(state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE);
+  DCHECK(state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE);
   return did_replace_entry_;
 }
 
 bool NavigationHandleImpl::ShouldUpdateHistory() {
-  DCHECK(state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE);
+  DCHECK(state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE);
   return should_update_history_;
 }
 
 const GURL& NavigationHandleImpl::GetPreviousURL() {
-  DCHECK(state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE);
+  DCHECK(state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE);
   return previous_url_;
 }
 
@@ -414,7 +403,7 @@
   // This is CANCELING because although the data comes in after
   // WILL_PROCESS_RESPONSE, it's possible for the navigation to be cancelled
   // after and the caller might want this value.
-  DCHECK(state_ >= NavigationRequest::CANCELING);
+  DCHECK_GE(state(), NavigationRequest::CANCELING);
   return navigation_request_->response()
              ? navigation_request_->response()->head.remote_endpoint
              : net::IPEndPoint();
@@ -491,7 +480,7 @@
 }
 
 const GlobalRequestID& NavigationHandleImpl::GetGlobalRequestID() {
-  DCHECK(state_ >= NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE);
+  DCHECK_GE(state(), NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE);
   return navigation_request_->request_id();
 }
 
@@ -516,8 +505,8 @@
 }
 
 bool NavigationHandleImpl::IsSameProcess() {
-  DCHECK(state_ == NavigationRequest::DID_COMMIT ||
-         state_ == NavigationRequest::DID_COMMIT_ERROR_PAGE);
+  DCHECK(state() == NavigationRequest::DID_COMMIT ||
+         state() == NavigationRequest::DID_COMMIT_ERROR_PAGE);
   return is_same_process_;
 }
 
@@ -566,17 +555,18 @@
   TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                "WillStartRequest");
   // WillStartRequest should only be called once.
-  if (state_ != NavigationRequest::INITIAL) {
-    state_ = NavigationRequest::CANCELING;
+  if (state() != NavigationRequest::INITIAL) {
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
     RunCompleteCallback(NavigationThrottle::CANCEL);
     return;
   }
 
-  state_ = NavigationRequest::PROCESSING_WILL_START_REQUEST;
+  navigation_request_->set_handle_state(
+      NavigationRequest::PROCESSING_WILL_START_REQUEST);
   complete_callback_ = std::move(callback);
 
   if (IsSelfReferentialURL()) {
-    state_ = NavigationRequest::CANCELING;
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
     RunCompleteCallback(NavigationThrottle::CANCEL);
     return;
   }
@@ -615,7 +605,8 @@
   was_redirected_ = true;
   redirect_chain_.push_back(GetURL());
 
-  state_ = NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST;
+  navigation_request_->set_handle_state(
+      NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST);
   complete_callback_ = std::move(callback);
 }
 
@@ -630,7 +621,7 @@
   navigation_request_->UpdateSiteURL(post_redirect_process);
 
   if (IsSelfReferentialURL()) {
-    state_ = NavigationRequest::CANCELING;
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
     RunCompleteCallback(NavigationThrottle::CANCEL);
     return;
   }
@@ -648,7 +639,8 @@
                                "WillFailRequest");
 
   complete_callback_ = std::move(callback);
-  state_ = NavigationRequest::PROCESSING_WILL_FAIL_REQUEST;
+  navigation_request_->set_handle_state(
+      NavigationRequest::PROCESSING_WILL_FAIL_REQUEST);
 
   // Notify each throttle of the request.
   throttle_runner_.ProcessNavigationEvent(
@@ -662,7 +654,8 @@
   TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                "WillProcessResponse");
 
-  state_ = NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE;
+  navigation_request_->set_handle_state(
+      NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE);
   complete_callback_ = std::move(callback);
 
   // Notify each throttle of the response.
@@ -676,7 +669,7 @@
   TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                "ReadyToCommitNavigation");
 
-  state_ = NavigationRequest::READY_TO_COMMIT;
+  navigation_request_->set_handle_state(NavigationRequest::READY_TO_COMMIT);
   ready_to_commit_time_ = base::TimeTicks::Now();
   RestartCommitTimeout();
 
@@ -748,11 +741,12 @@
       net_error_code_ != net::OK) {
     TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                  "DidCommitNavigation: error page");
-    state_ = NavigationRequest::DID_COMMIT_ERROR_PAGE;
+    navigation_request_->set_handle_state(
+        NavigationRequest::DID_COMMIT_ERROR_PAGE);
   } else {
     TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                  "DidCommitNavigation");
-    state_ = NavigationRequest::DID_COMMIT;
+    navigation_request_->set_handle_state(NavigationRequest::DID_COMMIT);
   }
 
   StopCommitTimeout();
@@ -845,21 +839,24 @@
 
 void NavigationHandleImpl::OnWillStartRequestProcessed(
     NavigationThrottle::ThrottleCheckResult result) {
-  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_START_REQUEST, state_);
+  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_START_REQUEST, state());
   DCHECK_NE(NavigationThrottle::BLOCK_RESPONSE, result.action());
-  if (result.action() == NavigationThrottle::PROCEED)
-    state_ = NavigationRequest::WILL_START_REQUEST;
-  else
-    state_ = NavigationRequest::CANCELING;
+  if (result.action() == NavigationThrottle::PROCEED) {
+    navigation_request_->set_handle_state(
+        NavigationRequest::WILL_START_REQUEST);
+  } else {
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
+  }
   RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::OnWillRedirectRequestProcessed(
     NavigationThrottle::ThrottleCheckResult result) {
-  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST, state_);
+  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST, state());
   DCHECK_NE(NavigationThrottle::BLOCK_RESPONSE, result.action());
   if (result.action() == NavigationThrottle::PROCEED) {
-    state_ = NavigationRequest::WILL_REDIRECT_REQUEST;
+    navigation_request_->set_handle_state(
+        NavigationRequest::WILL_REDIRECT_REQUEST);
 
 #if defined(OS_ANDROID)
     navigation_handle_proxy_->DidRedirect();
@@ -869,59 +866,60 @@
     if (GetDelegate())
       GetDelegate()->DidRedirectNavigation(this);
   } else {
-    state_ = NavigationRequest::CANCELING;
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
   }
   RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::OnWillFailRequestProcessed(
     NavigationThrottle::ThrottleCheckResult result) {
-  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_FAIL_REQUEST, state_);
+  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_FAIL_REQUEST, state());
   DCHECK_NE(NavigationThrottle::BLOCK_RESPONSE, result.action());
   if (result.action() == NavigationThrottle::PROCEED) {
-    state_ = NavigationRequest::WILL_FAIL_REQUEST;
+    navigation_request_->set_handle_state(NavigationRequest::WILL_FAIL_REQUEST);
     result = NavigationThrottle::ThrottleCheckResult(
         NavigationThrottle::PROCEED, net_error_code_);
   } else {
-    state_ = NavigationRequest::CANCELING;
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
   }
   RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::OnWillProcessResponseProcessed(
     NavigationThrottle::ThrottleCheckResult result) {
-  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE, state_);
+  DCHECK_EQ(NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE, state());
   DCHECK_NE(NavigationThrottle::BLOCK_REQUEST, result.action());
   DCHECK_NE(NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE, result.action());
   if (result.action() == NavigationThrottle::PROCEED) {
-    state_ = NavigationRequest::WILL_PROCESS_RESPONSE;
+    navigation_request_->set_handle_state(
+        NavigationRequest::WILL_PROCESS_RESPONSE);
     // If the navigation is done processing the response, then it's ready to
     // commit. Inform observers that the navigation is now ready to commit,
     // unless it is not set to commit (204/205s/downloads).
     if (GetRenderFrameHost())
       ReadyToCommitNavigation(false);
   } else {
-    state_ = NavigationRequest::CANCELING;
+    navigation_request_->set_handle_state(NavigationRequest::CANCELING);
   }
   RunCompleteCallback(result);
 }
 
 void NavigationHandleImpl::CancelDeferredNavigationInternal(
     NavigationThrottle::ThrottleCheckResult result) {
-  DCHECK(state_ == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
-         state_ == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
-         state_ == NavigationRequest::PROCESSING_WILL_FAIL_REQUEST ||
-         state_ == NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE);
+  DCHECK(state() == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
+         state() == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST ||
+         state() == NavigationRequest::PROCESSING_WILL_FAIL_REQUEST ||
+         state() == NavigationRequest::PROCESSING_WILL_PROCESS_RESPONSE);
   DCHECK(result.action() == NavigationThrottle::CANCEL_AND_IGNORE ||
          result.action() == NavigationThrottle::CANCEL ||
          result.action() == NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE);
   DCHECK(result.action() != NavigationThrottle::BLOCK_REQUEST_AND_COLLAPSE ||
-         state_ == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
-         state_ == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST);
+         state() == NavigationRequest::PROCESSING_WILL_START_REQUEST ||
+         state() == NavigationRequest::PROCESSING_WILL_REDIRECT_REQUEST);
 
   TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationHandle", this,
                                "CancelDeferredNavigation");
-  state_ = NavigationRequest::CANCELING;
+  navigation_request_->set_handle_state(NavigationRequest::CANCELING);
   RunCompleteCallback(result);
 }
 
@@ -988,7 +986,7 @@
 
 void NavigationHandleImpl::RestartCommitTimeout() {
   commit_timeout_timer_.Stop();
-  if (state_ >= NavigationRequest::DID_COMMIT)
+  if (state() >= NavigationRequest::DID_COMMIT)
     return;
 
   RenderProcessHost* renderer_host =
@@ -1007,7 +1005,7 @@
 }
 
 void NavigationHandleImpl::OnCommitTimeout() {
-  DCHECK_EQ(NavigationRequest::READY_TO_COMMIT, state_);
+  DCHECK_EQ(NavigationRequest::READY_TO_COMMIT, state());
   render_process_blocked_state_changed_subscription_.reset();
   GetRenderFrameHost()->GetRenderWidgetHost()->RendererIsUnresponsive(
       base::BindRepeating(&NavigationHandleImpl::RestartCommitTimeout,
diff --git a/content/browser/frame_host/navigation_handle_impl.h b/content/browser/frame_host/navigation_handle_impl.h
index dfbaa782..e0639d4 100644
--- a/content/browser/frame_host/navigation_handle_impl.h
+++ b/content/browser/frame_host/navigation_handle_impl.h
@@ -151,7 +151,7 @@
 
   // Used in tests.
   NavigationRequest::NavigationHandleState state_for_testing() const {
-    return state_;
+    return state();
   }
 
   // The NavigatorDelegate to notify/query for various navigation events.
@@ -167,12 +167,12 @@
   NavigatorDelegate* GetDelegate() const;
 
   blink::mojom::RequestContextType request_context_type() const {
-    DCHECK_GE(state_, NavigationRequest::PROCESSING_WILL_START_REQUEST);
+    DCHECK_GE(state(), NavigationRequest::PROCESSING_WILL_START_REQUEST);
     return navigation_request_->begin_params()->request_context_type;
   }
 
   blink::WebMixedContentContextType mixed_content_context_type() const {
-    DCHECK_GE(state_, NavigationRequest::PROCESSING_WILL_START_REQUEST);
+    DCHECK_GE(state(), NavigationRequest::PROCESSING_WILL_START_REQUEST);
     return navigation_request_->begin_params()->mixed_content_context_type;
   }
 
@@ -276,7 +276,7 @@
   const GURL& base_url() { return base_url_; }
 
   NavigationType navigation_type() {
-    DCHECK_GE(state_, NavigationRequest::DID_COMMIT);
+    DCHECK_GE(state(), NavigationRequest::DID_COMMIT);
     return navigation_type_;
   }
 
@@ -363,8 +363,9 @@
   // end of a round of NavigationThrottleChecks.
   void RunCompleteCallback(NavigationThrottle::ThrottleCheckResult result);
 
-  // Used in tests.
-  NavigationRequest::NavigationHandleState state() const { return state_; }
+  NavigationRequest::NavigationHandleState state() const {
+    return navigation_request_->handle_state();
+  }
 
   // Checks for attempts to navigate to a page that is already referenced more
   // than once in the frame's ancestors.  This is a helper function used by
@@ -403,9 +404,6 @@
   std::vector<std::string> removed_request_headers_;
   net::HttpRequestHeaders modified_request_headers_;
 
-  // The state the navigation is in.
-  NavigationRequest::NavigationHandleState state_;
-
   // The time this navigation was ready to commit.
   base::TimeTicks ready_to_commit_time_;
 
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 1f4476e2..2f0a21e 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -77,7 +77,6 @@
 #include "services/network/public/cpp/url_loader_completion_status.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/common/frame/sandbox_flags.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/appcache/appcache.mojom.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom.h"
 #include "third_party/blink/public/mojom/renderer_preferences.mojom.h"
@@ -821,6 +820,7 @@
   net::HttpRequestHeaders headers;
   headers.AddHeadersFromString(begin_params_->headers);
 
+  handle_state_ = NavigationRequest::INITIAL;
   std::unique_ptr<NavigationHandleImpl> navigation_handle =
       base::WrapUnique(new NavigationHandleImpl(
           this, redirect_chain, nav_entry_id_, std::move(navigation_ui_data_),
@@ -1734,17 +1734,13 @@
   // If the NavigationThrottles allowed the navigation to continue, have the
   // processing of the response resume in the network stack.
   if (result.action() == NavigationThrottle::PROCEED) {
-    // NetworkService doesn't use ResourceDispatcherHost.
-    bool served_via_resource_dispatcher_host =
-        !base::FeatureList::IsEnabled(network::features::kNetworkService);
-    // When S13nServiceWorker is on, it doesn't use ResourceDispatcherHost when
+    // ResourceDispatcherHost is not used when the network service is on or when
     // a service worker serves the response.
-    served_via_resource_dispatcher_host =
-        served_via_resource_dispatcher_host &&
-        !(blink::ServiceWorkerUtils::IsServicificationEnabled() &&
-          response_->head.was_fetched_via_service_worker);
+    bool served_via_resource_dispatcher_host =
+        !base::FeatureList::IsEnabled(network::features::kNetworkService) &&
+        !response_->head.was_fetched_via_service_worker;
 
-    // NetworkService or S13nServiceWorker: If this is a download, intercept the
+    // If this is a download without ResourceDispatcherHost, intercept the
     // navigation response and pass it to DownloadManager, and cancel the
     // navigation.
     if (is_download_ && !served_via_resource_dispatcher_host) {
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h
index afa56e8..e0c5fe5 100644
--- a/content/browser/frame_host/navigation_request.h
+++ b/content/browser/frame_host/navigation_request.h
@@ -77,7 +77,8 @@
   //                the duplicates. Remove the PROCESSING_* states once the
   //                NavigationThrottleRunner is owned by the NavigationRequest.
   enum NavigationHandleState {
-    INITIAL = 0,
+    NOT_CREATED = 0,
+    INITIAL,
     PROCESSING_WILL_START_REQUEST,
     WILL_START_REQUEST,
     PROCESSING_WILL_REDIRECT_REQUEST,
@@ -217,7 +218,18 @@
   // The RenderFrameHost that will commit the navigation or an error page.
   // This is computed when the response is received, or when the navigation
   // fails and error page should be displayed.
-  RenderFrameHostImpl* render_frame_host() const { return render_frame_host_; }
+  RenderFrameHostImpl* render_frame_host() const {
+    // Only allow the RenderFrameHost to be retrieved once it has been set for
+    // this navigation. This will happens either at WillProcessResponse time for
+    // regular navigations or at WillFailRequest time for error pages.
+    CHECK_GE(handle_state_, PROCESSING_WILL_FAIL_REQUEST)
+        << "This accessor should only be called after a RenderFrameHost has "
+           "been picked for this navigation.";
+    static_assert(
+        WILL_FAIL_REQUEST < WILL_PROCESS_RESPONSE,
+        "WillFailRequest state should come before WillProcessResponse");
+    return render_frame_host_;
+  }
 
   const network::ResourceResponse* response() { return response_.get(); }
   const GlobalRequestID& request_id() const { return request_id_; }
@@ -294,6 +306,14 @@
 
   int navigation_entry_offset() { return navigation_entry_offset_; }
 
+  // TODO(zetamoo): Remove once |handle_state_| is modified exclusively from
+  //                NavigationRequest.
+  void set_handle_state(const NavigationHandleState state) {
+    handle_state_ = state;
+  }
+
+  NavigationHandleState handle_state() { return handle_state_; }
+
  private:
   NavigationRequest(FrameTreeNode* frame_tree_node,
                     const CommonNavigationParams& common_params,
@@ -574,6 +594,9 @@
   // See NavigationHandle::GetNavigationEntryOffset() for details.
   int navigation_entry_offset_ = 0;
 
+  // TODO(zetamoo): Merge |handle_state_| with |state_|.
+  NavigationHandleState handle_state_ = NOT_CREATED;
+
   base::WeakPtrFactory<NavigationRequest> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(NavigationRequest);
diff --git a/content/browser/loader/cross_site_document_blocking_browsertest.cc b/content/browser/loader/cross_site_document_blocking_browsertest.cc
index 7a4e896..a2ddd7a 100644
--- a/content/browser/loader/cross_site_document_blocking_browsertest.cc
+++ b/content/browser/loader/cross_site_document_blocking_browsertest.cc
@@ -48,7 +48,6 @@
 #include "services/network/public/cpp/network_switches.h"
 #include "services/network/test/test_url_loader_client.h"
 #include "testing/gmock/include/gmock/gmock.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -1499,56 +1498,6 @@
   DISALLOW_COPY_AND_ASSIGN(CrossSiteDocumentBlockingServiceWorkerTest);
 };
 
-// Issue a cross-origin request that will be handled entirely within a service
-// worker (without reaching the network - the cross-origin response will be
-// "faked" within the same-origin service worker, because the service worker
-// used by the test recognizes the "data_from_service_worker" suffix in the
-// URL).  This testcase is designed to hit the case in
-// CrossSiteDocumentResourceHandler::ShouldBlockBasedOnHeaders where
-// |response_type_via_service_worker| is equal to |kDefault|.  See also
-// https://crbug.com/803672.
-//
-// TODO(lukasza): https://crbug.com/715640: This test might become invalid
-// after servicification of service workers.
-IN_PROC_BROWSER_TEST_F(CrossSiteDocumentBlockingServiceWorkerTest, NoNetwork) {
-  // Skip this test when servicification of service workers (S13nServiceWorker)
-  // is enabled because the browser process doesn't see the request or response
-  // when the request is handled entirely within the service worker.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled() ||
-      base::FeatureList::IsEnabled(network::features::kNetworkService)) {
-    return;
-  }
-
-  SetUpServiceWorker();
-
-  // Make sure that base::HistogramTester below starts with a clean slate.
-  FetchHistogramsFromChildProcesses();
-
-  base::HistogramTester histograms;
-  std::string response;
-  std::string script = R"(
-      // Any cross-origin URL ending with .../data_from_service_worker can be
-      // used here - it will be intercepted by the service worker and will never
-      // go to the network.
-      fetch('https://bar.com/data_from_service_worker')
-          .then(response => response.text())
-          .then(responseText => {
-              domAutomationController.send(responseText);
-          })
-          .catch(error => {
-              var errorMessage = 'error: ' + error;
-              console.log(errorMessage);
-              domAutomationController.send(errorMessage);
-          }); )";
-  EXPECT_TRUE(ExecuteScriptAndExtractString(shell(), script, &response));
-
-  // Verify that CORB didn't block the response (since it was "faked" within the
-  // service worker and didn't cross any security boundaries).
-  EXPECT_EQ("Response created by service worker", response);
-  InspectHistograms(histograms, kShouldBeAllowedWithoutSniffing, "blah.html",
-                    RESOURCE_TYPE_XHR);
-}
-
 IN_PROC_BROWSER_TEST_F(CrossSiteDocumentBlockingServiceWorkerTest,
                        NetworkToServiceWorkerResponse) {
   SetUpServiceWorker();
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc
index 1e9ef564..60eb029 100644
--- a/content/browser/navigation_browsertest.cc
+++ b/content/browser/navigation_browsertest.cc
@@ -29,6 +29,7 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/browser/download_manager_delegate.h"
 #include "content/public/browser/navigation_controller.h"
+#include "content/public/browser/notification_service.h"
 #include "content/public/browser/notification_types.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
@@ -1791,4 +1792,86 @@
       base::ContainsKey(response_2.http_request()->headers, "header_name"));
 }
 
+struct NewWebContentsData {
+  NewWebContentsData() = default;
+  NewWebContentsData(NewWebContentsData&& other)
+      : new_web_contents(std::move(other.new_web_contents)),
+        manager(std::move(other.manager)) {}
+
+  std::unique_ptr<WebContents> new_web_contents;
+  std::unique_ptr<TestNavigationManager> manager;
+};
+
+class CreateWebContentsOnCrashObserver : public NotificationObserver {
+ public:
+  CreateWebContentsOnCrashObserver(const GURL& url,
+                                   WebContents* first_web_contents)
+      : url_(url), first_web_contents_(first_web_contents) {}
+
+  void Observe(int type,
+               const NotificationSource& source,
+               const NotificationDetails& details) override {
+    EXPECT_EQ(content::NOTIFICATION_RENDERER_PROCESS_CLOSED, type);
+
+    // Only do this once in the test.
+    if (observed_)
+      return;
+    observed_ = true;
+
+    WebContents::CreateParams new_contents_params(
+        first_web_contents_->GetBrowserContext(),
+        first_web_contents_->GetSiteInstance());
+    data_.new_web_contents = WebContents::Create(new_contents_params);
+    data_.manager = std::make_unique<TestNavigationManager>(
+        data_.new_web_contents.get(), url_);
+    NavigationController::LoadURLParams load_params(url_);
+    data_.new_web_contents->GetController().LoadURLWithParams(load_params);
+  }
+
+  NewWebContentsData TakeNewWebContentsData() { return std::move(data_); }
+
+ private:
+  NewWebContentsData data_;
+  bool observed_ = false;
+
+  GURL url_;
+  WebContents* first_web_contents_;
+};
+
+// This test simulates android webview's behavior in apps that handle
+// renderer crashes by synchronously creating a new WebContents and loads
+// the same page again. This reenters into content code.
+IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, WebViewRendererKillReload) {
+  // Webview is limited to one renderer.
+  RenderProcessHost::SetMaxRendererProcessCount(1u);
+
+  // Load a page into first webview.
+  auto* web_contents = shell()->web_contents();
+  GURL url(embedded_test_server()->GetURL("/simple_links.html"));
+  {
+    TestNavigationObserver observer(web_contents);
+    EXPECT_TRUE(NavigateToURL(web_contents, url));
+    EXPECT_EQ(url, observer.last_navigation_url());
+  }
+
+  // Install a crash observer that synchronously creates and loads a new
+  // WebContents. Then crash the renderer which triggers the observer.
+  CreateWebContentsOnCrashObserver crash_observer(url, web_contents);
+  content::NotificationRegistrar notification_registrar;
+  notification_registrar.Add(&crash_observer,
+                             content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
+                             content::NotificationService::AllSources());
+  NavigateToURLBlockUntilNavigationsComplete(web_contents, GURL("chrome:crash"),
+                                             1);
+
+  // Wait for navigation in new WebContents to finish.
+  NewWebContentsData data = crash_observer.TakeNewWebContentsData();
+  data.manager->WaitForNavigationFinished();
+
+  // Test passes if renderer is still alive.
+  EXPECT_TRUE(ExecJs(data.new_web_contents.get(), "true;"));
+  EXPECT_TRUE(data.new_web_contents->GetMainFrame()->IsRenderFrameLive());
+  EXPECT_EQ(url, data.new_web_contents->GetMainFrame()->GetLastCommittedURL());
+}
+
 }  // namespace content
diff --git a/content/browser/renderer_host/render_process_host_impl.cc b/content/browser/renderer_host/render_process_host_impl.cc
index 11d57971..8b154b7c 100644
--- a/content/browser/renderer_host/render_process_host_impl.cc
+++ b/content/browser/renderer_host/render_process_host_impl.cc
@@ -4163,12 +4163,8 @@
     info.exit_code = shutdown_exit_code_;
 
   within_process_died_observer_ = true;
-  NotificationService::current()->Notify(
-      NOTIFICATION_RENDERER_PROCESS_CLOSED, Source<RenderProcessHost>(this),
-      Details<ChildProcessTerminationInfo>(&info));
   for (auto& observer : observers_)
     observer.RenderProcessExited(this, info);
-  within_process_died_observer_ = false;
 
   base::IDMap<IPC::Listener*>::iterator iter(&listeners_);
   while (!iter.IsAtEnd()) {
@@ -4177,6 +4173,11 @@
     iter.Advance();
   }
 
+  NotificationService::current()->Notify(
+      NOTIFICATION_RENDERER_PROCESS_CLOSED, Source<RenderProcessHost>(this),
+      Details<ChildProcessTerminationInfo>(&info));
+  within_process_died_observer_ = false;
+
   RemoveUserData(kSessionStorageHolderKey);
 
   // Initialize a new ChannelProxy in case this host is re-used for a new
diff --git a/content/browser/resources/media/webrtc_internals.js b/content/browser/resources/media/webrtc_internals.js
index 2b420e5..c4de346 100644
--- a/content/browser/resources/media/webrtc_internals.js
+++ b/content/browser/resources/media/webrtc_internals.js
@@ -293,6 +293,7 @@
 
   appendChildWithText(requestDiv, 'div', 'Caller origin: ' + data.origin);
   appendChildWithText(requestDiv, 'div', 'Caller process id: ' + data.pid);
+  appendChildWithText(requestDiv, 'div', 'Time: ' + (new Date(data.timestamp)));
   appendChildWithText(requestDiv, 'span', 'Audio Constraints')
       .style.fontWeight = 'bold';
   appendChildWithText(requestDiv, 'div', data.audio);
diff --git a/content/browser/scheduler/browser_task_executor.cc b/content/browser/scheduler/browser_task_executor.cc
index 09c494c7..e829e4b 100644
--- a/content/browser/scheduler/browser_task_executor.cc
+++ b/content/browser/scheduler/browser_task_executor.cc
@@ -9,10 +9,12 @@
 #include "base/bind.h"
 #include "base/deferred_sequenced_task_runner.h"
 #include "base/no_destructor.h"
+#include "base/task/post_task.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/browser_thread_impl.h"
 #include "content/browser/scheduler/browser_ui_thread_scheduler.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 
 #if defined(OS_ANDROID)
 #include "base/android/task_scheduler/post_task_android.h"
@@ -226,6 +228,35 @@
   }
 }
 
+// static
+void BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(
+    BrowserThread::ID identifier) {
+  DCHECK(g_browser_task_executor);
+  DCHECK(g_browser_task_executor->browser_ui_thread_scheduler_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  switch (identifier) {
+    case BrowserThread::UI:
+      g_browser_task_executor->browser_ui_thread_scheduler_
+          ->RunAllPendingTasksForTesting();
+      break;
+
+    case BrowserThread::IO: {
+      // TODO(https://crbug/863341): Do something more clever once we have a
+      // scheduler
+      base::RunLoop run_loop(base::RunLoop::Type::kNestableTasksAllowed);
+      base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO},
+                               run_loop.QuitClosure());
+      run_loop.Run();
+      break;
+    }
+
+    case BrowserThread::ID_COUNT:
+      NOTREACHED();
+      break;
+  }
+}
+
 bool BrowserTaskExecutor::PostDelayedTaskWithTraits(
     const base::Location& from_here,
     const base::TaskTraits& traits,
diff --git a/content/browser/scheduler/browser_task_executor.h b/content/browser/scheduler/browser_task_executor.h
index 1ca9006..a576ab995 100644
--- a/content/browser/scheduler/browser_task_executor.h
+++ b/content/browser/scheduler/browser_task_executor.h
@@ -13,6 +13,7 @@
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 
 namespace content {
 
@@ -44,6 +45,19 @@
   // Unregister and delete the TaskExecutor after a test.
   static void ResetForTesting();
 
+  // Runs all pending tasks for the given thread. Tasks posted after this method
+  // is called (in particular any task posted from within any of the pending
+  // tasks) will be queued but not run. Conceptually this call will disable all
+  // queues, run any pending tasks, and re-enable all the queues.
+  //
+  // If any of the pending tasks posted a task, these could be run by calling
+  // this method again or running a regular RunLoop. But if that were the case
+  // you should probably rewrite you tests to wait for a specific event instead.
+  //
+  // NOTE: Can only be called from the UI thread.
+  static void RunAllPendingTasksOnThreadForTesting(
+      BrowserThread::ID identifier);
+
   // base::TaskExecutor implementation.
   bool PostDelayedTaskWithTraits(const base::Location& from_here,
                                  const base::TaskTraits& traits,
diff --git a/content/browser/scheduler/browser_task_executor_unittest.cc b/content/browser/scheduler/browser_task_executor_unittest.cc
index 8a4972c..33f90d6 100644
--- a/content/browser/scheduler/browser_task_executor_unittest.cc
+++ b/content/browser/scheduler/browser_task_executor_unittest.cc
@@ -11,15 +11,21 @@
 #include "base/bind_helpers.h"
 #include "base/task/post_task.h"
 #include "base/task/task_scheduler/task_scheduler.h"
+#include "base/test/mock_callback.h"
 #include "base/test/scoped_task_environment.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "content/browser/scheduler/browser_ui_thread_scheduler.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "content/test/test_content_browser_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace content {
 
+using ::testing::Invoke;
+using ::testing::Mock;
+
 class BrowserTaskExecutorTest : public testing::Test {
  public:
   BrowserTaskExecutorTest() {
@@ -81,6 +87,67 @@
 }
 }  // namespace
 
+using MockTask =
+    testing::StrictMock<base::MockCallback<base::RepeatingCallback<void()>>>;
+
+TEST_F(BrowserTaskExecutorTest, RunAllPendingTasksForTestingOnUI) {
+  MockTask task_1;
+  MockTask task_2;
+  EXPECT_CALL(task_1, Run).WillOnce(testing::Invoke([&]() {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task_2.Get());
+  }));
+
+  base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, task_1.Get());
+
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::UI);
+
+  // Cleanup pending tasks, as TestBrowserThreadBundle will run them.
+  Mock::VerifyAndClearExpectations(&task_1);
+  EXPECT_CALL(task_2, Run);
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+}
+
+TEST_F(BrowserTaskExecutorTest, RunAllPendingTasksForTestingOnIO) {
+  MockTask task_1;
+  MockTask task_2;
+  EXPECT_CALL(task_1, Run).WillOnce(testing::Invoke([&]() {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task_2.Get());
+  }));
+
+  base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO}, task_1.Get());
+
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+
+  // Cleanup pending tasks, as TestBrowserThreadBundle will run them.
+  Mock::VerifyAndClearExpectations(&task_1);
+  EXPECT_CALL(task_2, Run);
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+}
+
+TEST_F(BrowserTaskExecutorTest, RunAllPendingTasksForTestingOnIOIsReentrant) {
+  MockTask task_1;
+  MockTask task_2;
+  MockTask task_3;
+
+  EXPECT_CALL(task_1, Run).WillOnce(Invoke([&]() {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task_2.Get());
+    BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(
+        BrowserThread::IO);
+  }));
+  EXPECT_CALL(task_2, Run).WillOnce(Invoke([&]() {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, task_3.Get());
+  }));
+
+  base::PostTaskWithTraits(FROM_HERE, {BrowserThread::IO}, task_1.Get());
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+
+  // Cleanup pending tasks, as TestBrowserThreadBundle will run them.
+  Mock::VerifyAndClearExpectations(&task_1);
+  Mock::VerifyAndClearExpectations(&task_2);
+  EXPECT_CALL(task_3, Run);
+  BrowserTaskExecutor::RunAllPendingTasksOnThreadForTesting(BrowserThread::IO);
+}
+
 TEST_F(BrowserTaskExecutorTest, UserVisibleOrBlockingTasksRunDuringStartup) {
   bool ran_best_effort = false;
   bool ran_user_visible = false;
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.cc b/content/browser/scheduler/browser_ui_thread_scheduler.cc
index 921d667..c4e85fe0 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.cc
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.cc
@@ -10,6 +10,7 @@
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/process/process.h"
+#include "base/run_loop.h"
 #include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/sequence_manager/sequence_manager_impl.h"
 #include "base/task/sequence_manager/time_domain.h"
@@ -105,4 +106,23 @@
   return scoped_refptr<base::SingleThreadTaskRunner>();
 }
 
+void BrowserUIThreadScheduler::RunAllPendingTasksForTesting() {
+  std::vector<scoped_refptr<BrowserUIThreadTaskQueue>> fenced_queues;
+  for (const auto& queue : task_queues_) {
+    bool had_fence = queue.second->HasActiveFence();
+    queue.second->InsertFence(
+        base::sequence_manager::TaskQueue::InsertFencePosition::kNow);
+    // If there was a fence already this must be a re-entrant call to this
+    // method. The previous statement just moved the fence further back. In this
+    // case we do not remove the fence as the parent run loop needs all queues
+    // to be fenced to be able to exit the run loop (i.e. become idle)
+    if (!had_fence)
+      fenced_queues.push_back(queue.second);
+  }
+  base::RunLoop(base::RunLoop::Type::kNestableTasksAllowed).RunUntilIdle();
+  for (const auto& queue : fenced_queues) {
+    queue->RemoveFence();
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler.h b/content/browser/scheduler/browser_ui_thread_scheduler.h
index c333011..d511c23 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler.h
+++ b/content/browser/scheduler/browser_ui_thread_scheduler.h
@@ -46,6 +46,11 @@
   scoped_refptr<base::SingleThreadTaskRunner> GetTaskRunnerForTesting(
       QueueType queue_type);
 
+  // Adds a fence to all queues, runs all tasks until idle, and finally removes
+  // the fences. Note that the run loop will eventually become idle, as new
+  // tasks will not be scheduled due to the fence.
+  void RunAllPendingTasksForTesting();
+
  private:
   friend class BrowserTaskExecutor;
 
diff --git a/content/browser/scheduler/browser_ui_thread_scheduler_unittest.cc b/content/browser/scheduler/browser_ui_thread_scheduler_unittest.cc
index aa9984ae..c5c54a2a 100644
--- a/content/browser/scheduler/browser_ui_thread_scheduler_unittest.cc
+++ b/content/browser/scheduler/browser_ui_thread_scheduler_unittest.cc
@@ -12,16 +12,17 @@
 #include "base/run_loop.h"
 #include "base/task/post_task.h"
 #include "base/task/task_scheduler/task_scheduler.h"
+#include "base/test/mock_callback.h"
 #include "content/public/browser/browser_task_traits.h"
-#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
-using testing::ElementsAre;
-
 namespace content {
-
 namespace {
 
+using ::testing::ElementsAre;
+using ::testing::Invoke;
+using ::testing::Mock;
+
 void RecordRunOrder(std::vector<int>* run_order, int order) {
   run_order->push_back(order);
 }
@@ -48,24 +49,68 @@
 
 class BrowserUIThreadSchedulerTest : public testing::Test {
  public:
-  void SetUp() override {
+  BrowserUIThreadSchedulerTest() {
     browser_ui_thread_scheduler_ = std::make_unique<BrowserUIThreadScheduler>();
-  }
-
-  void TearDown() override { ShutdownBrowserUIThreadScheduler(); }
-
-  void ShutdownBrowserUIThreadScheduler() {
-    browser_ui_thread_scheduler_.reset();
+    for (int i = 0;
+         i < static_cast<int>(BrowserUIThreadTaskQueue::QueueType::kCount);
+         i++) {
+      auto queue_type = static_cast<BrowserUIThreadTaskQueue::QueueType>(i);
+      task_runners_.emplace(
+          queue_type,
+          browser_ui_thread_scheduler_->GetTaskRunnerForTesting(queue_type));
+    }
   }
 
  protected:
+  using QueueType = BrowserUIThreadScheduler::QueueType;
+  using MockTask =
+      testing::StrictMock<base::MockCallback<base::RepeatingCallback<void()>>>;
+
   std::unique_ptr<BrowserUIThreadScheduler> browser_ui_thread_scheduler_;
+  base::flat_map<BrowserUIThreadScheduler::QueueType,
+                 scoped_refptr<base::SingleThreadTaskRunner>>
+      task_runners_;
 };
 
+TEST_F(BrowserUIThreadSchedulerTest, RunAllPendingTasksForTesting) {
+  MockTask task;
+  MockTask nested_task;
+  EXPECT_CALL(task, Run).WillOnce(Invoke([&]() {
+    task_runners_[QueueType::kDefault]->PostTask(FROM_HERE, nested_task.Get());
+    task_runners_[QueueType::kBestEffort]->PostTask(FROM_HERE,
+                                                    nested_task.Get());
+  }));
+
+  task_runners_[QueueType::kDefault]->PostTask(FROM_HERE, task.Get());
+
+  browser_ui_thread_scheduler_->RunAllPendingTasksForTesting();
+
+  Mock::VerifyAndClearExpectations(&task);
+  EXPECT_CALL(nested_task, Run).Times(2);
+
+  browser_ui_thread_scheduler_->RunAllPendingTasksForTesting();
+}
+
+TEST_F(BrowserUIThreadSchedulerTest, RunAllPendingTasksForTestingIsReentrant) {
+  MockTask task_1;
+  MockTask task_2;
+  MockTask task_3;
+
+  EXPECT_CALL(task_1, Run).WillOnce(Invoke([&]() {
+    task_runners_[QueueType::kDefault]->PostTask(FROM_HERE, task_2.Get());
+    browser_ui_thread_scheduler_->RunAllPendingTasksForTesting();
+  }));
+  EXPECT_CALL(task_2, Run).WillOnce(Invoke([&]() {
+    task_runners_[QueueType::kDefault]->PostTask(FROM_HERE, task_3.Get());
+  }));
+
+  task_runners_[QueueType::kDefault]->PostTask(FROM_HERE, task_1.Get());
+  browser_ui_thread_scheduler_->RunAllPendingTasksForTesting();
+}
+
 TEST_F(BrowserUIThreadSchedulerTest, SimplePosting) {
   scoped_refptr<base::SingleThreadTaskRunner> tq =
-      browser_ui_thread_scheduler_->GetTaskRunnerForTesting(
-          BrowserUIThreadScheduler::QueueType::kDefault);
+      task_runners_[QueueType::kDefault];
 
   std::vector<int> order;
   tq->PostTask(FROM_HERE, base::BindOnce(RecordRunOrder, &order, 1));
@@ -79,8 +124,7 @@
 
 TEST_F(BrowserUIThreadSchedulerTest, DestructorPostChainDuringShutdown) {
   scoped_refptr<base::SingleThreadTaskRunner> task_queue =
-      browser_ui_thread_scheduler_->GetTaskRunnerForTesting(
-          BrowserUIThreadScheduler::QueueType::kDefault);
+      task_runners_[QueueType::kDefault];
 
   bool run = false;
   task_queue->PostTask(
@@ -92,7 +136,7 @@
                                 [](bool* run) { *run = true; }, &run)))));
 
   EXPECT_FALSE(run);
-  ShutdownBrowserUIThreadScheduler();
+  browser_ui_thread_scheduler_.reset();
 
   EXPECT_TRUE(run);
 }
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index 2f83d404..822cab1 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -1431,4 +1431,72 @@
             kill_waiter.Wait());
 }
 
+class BeginNavigationTransitionReplacer : public FrameHostInterceptor {
+ public:
+  BeginNavigationTransitionReplacer(WebContents* web_contents,
+                                    ui::PageTransition transition_to_inject)
+      : FrameHostInterceptor(web_contents),
+        transition_to_inject_(transition_to_inject) {}
+
+  bool WillDispatchBeginNavigation(
+      RenderFrameHost* render_frame_host,
+      CommonNavigationParams* common_params,
+      mojom::BeginNavigationParamsPtr* begin_params,
+      blink::mojom::BlobURLTokenPtr* blob_url_token,
+      mojom::NavigationClientAssociatedPtrInfo* navigation_client,
+      blink::mojom::NavigationInitiatorPtr* navigation_initiator) override {
+    if (is_activated_) {
+      common_params->transition = transition_to_inject_;
+      is_activated_ = false;
+    }
+
+    return true;
+  }
+
+  void Activate() { is_activated_ = true; }
+
+ private:
+  ui::PageTransition transition_to_inject_;
+  bool is_activated_ = false;
+
+  DISALLOW_COPY_AND_ASSIGN(BeginNavigationTransitionReplacer);
+};
+
+IN_PROC_BROWSER_TEST_F(SecurityExploitBrowserTest, NonWebbyTransition) {
+  const ui::PageTransition test_cases[] = {
+      ui::PAGE_TRANSITION_TYPED,
+      ui::PAGE_TRANSITION_AUTO_BOOKMARK,
+      ui::PAGE_TRANSITION_GENERATED,
+      ui::PAGE_TRANSITION_AUTO_TOPLEVEL,
+      ui::PAGE_TRANSITION_RELOAD,
+      ui::PAGE_TRANSITION_KEYWORD,
+      ui::PAGE_TRANSITION_KEYWORD_GENERATED};
+
+  for (ui::PageTransition transition : test_cases) {
+    // Prepare to intercept BeginNavigation mojo IPC.  This has to be done
+    // before the test creates the RenderFrameHostImpl that is the target of the
+    // IPC.
+    WebContents* web_contents = shell()->web_contents();
+    BeginNavigationTransitionReplacer injector(web_contents, transition);
+
+    // Navigate to a test page.
+    GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
+    EXPECT_TRUE(NavigateToURL(web_contents, main_url));
+
+    // Start monitoring for renderer kills.
+    RenderProcessHost* main_process =
+        web_contents->GetMainFrame()->GetProcess();
+    RenderProcessHostKillWaiter kill_waiter(main_process);
+
+    // Have the main frame submit a BeginNavigation IPC with a missing
+    // initiator.
+    injector.Activate();
+    EXPECT_TRUE(ExecJs(web_contents, "window.location = '/title2.html';"));
+
+    // Verify that the renderer was terminated.
+    EXPECT_EQ(bad_message::RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION,
+              kill_waiter.Wait());
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/embedded_worker_instance.cc b/content/browser/service_worker/embedded_worker_instance.cc
index 9a3c9df6..f54fadf 100644
--- a/content/browser/service_worker/embedded_worker_instance.cc
+++ b/content/browser/service_worker/embedded_worker_instance.cc
@@ -39,7 +39,6 @@
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "services/network/public/cpp/features.h"
 #include "third_party/blink/public/common/features.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom.h"
 #include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
@@ -267,27 +266,24 @@
   devtools_proxy = std::make_unique<EmbeddedWorkerInstance::DevToolsProxy>(
       process_id, routing_id);
 
-  // S13nServiceWorker: Create factory bundles for this worker to do loading.
-  // These bundles don't support reconnection to the network service, see
-  // below comments.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    const url::Origin origin = url::Origin::Create(params->script_url);
+  // Create factory bundles for this worker to do loading. These bundles don't
+  // support reconnection to the network service, see below comments.
+  const url::Origin origin = url::Origin::Create(params->script_url);
 
-    // The bundle for the browser is passed to ServiceWorkerScriptLoaderFactory
-    // and used to request non-installed service worker scripts. It's OK to not
-    // support reconnection to then network service because it can only used
-    // until the service worker reaches the 'installed' state.
-    //
-    // TODO(falken): Only make this bundle for non-installed service workers.
-    factory_bundle_for_browser = CreateFactoryBundle(rph, routing_id, origin);
+  // The bundle for the browser is passed to ServiceWorkerScriptLoaderFactory
+  // and used to request non-installed service worker scripts. It's OK to not
+  // support reconnection to then network service because it can only used
+  // until the service worker reaches the 'installed' state.
+  //
+  // TODO(falken): Only make this bundle for non-installed service workers.
+  factory_bundle_for_browser = CreateFactoryBundle(rph, routing_id, origin);
 
-    // The bundle for the renderer is passed to the service worker, and
-    // used for subresource loading from the service worker (i.e., fetch()).
-    // It's OK to not support reconnection to the network service because the
-    // service worker terminates itself when the connection breaks, so a new
-    // instance can be started.
-    factory_bundle_for_renderer = CreateFactoryBundle(rph, routing_id, origin);
-  }
+  // The bundle for the renderer is passed to the service worker, and
+  // used for subresource loading from the service worker (i.e., fetch()).
+  // It's OK to not support reconnection to the network service because the
+  // service worker terminates itself when the connection breaks, so a new
+  // instance can be started.
+  factory_bundle_for_renderer = CreateFactoryBundle(rph, routing_id, origin);
 
   // TODO(crbug.com/862854): Support changes to
   // blink::mojom::RendererPreferences while the worker is running.
@@ -639,18 +635,16 @@
 
     // S13nServiceWorker: Build the URLLoaderFactory for loading new scripts.
     scoped_refptr<network::SharedURLLoaderFactory> factory_for_new_scripts;
-    if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-      DCHECK(factory_bundle_for_browser);
-      factory_for_new_scripts =
-          base::MakeRefCounted<blink::URLLoaderFactoryBundle>(
-              std::move(factory_bundle_for_browser));
+    DCHECK(factory_bundle_for_browser);
+    factory_for_new_scripts =
+        base::MakeRefCounted<blink::URLLoaderFactoryBundle>(
+            std::move(factory_bundle_for_browser));
 
-      // Send the factory bundle for subresource loading from the service worker
-      // (i.e. fetch()).
-      DCHECK(factory_bundle_for_renderer);
-      params->subresource_loader_factories =
-          std::move(factory_bundle_for_renderer);
-    }
+    // Send the factory bundle for subresource loading from the service worker
+    // (i.e. fetch()).
+    DCHECK(factory_bundle_for_renderer);
+    params->subresource_loader_factories =
+        std::move(factory_bundle_for_renderer);
 
     instance_->SendStartWorker(std::move(params),
                                std::move(factory_for_new_scripts),
@@ -853,14 +847,6 @@
 
 void EmbeddedWorkerInstance::RequestTermination(
     RequestTerminationCallback callback) {
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    mojo::ReportBadMessage(
-        "Invalid termination request: RequestTermination() was called but "
-        "S13nServiceWorker is not enabled");
-    std::move(callback).Run(true /* will_be_terminated */);
-    return;
-  }
-
   if (status() != EmbeddedWorkerStatus::RUNNING &&
       status() != EmbeddedWorkerStatus::STOPPING) {
     mojo::ReportBadMessage(
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index b6fba02..85c0942f 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -20,7 +20,6 @@
 #include "mojo/public/cpp/bindings/binding_set.h"
 #include "mojo/public/cpp/bindings/interface_request.h"
 #include "net/http/http_util.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
 
 namespace content {
@@ -181,11 +180,9 @@
   new_render_process_host_->OverrideRendererInterfaceForTesting(
       std::move(new_renderer_interface_ptr));
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    default_network_loader_factory_ =
-        std::make_unique<MockNetworkURLLoaderFactory>();
-    SetNetworkFactory(default_network_loader_factory_.get());
-  }
+  default_network_loader_factory_ =
+      std::make_unique<MockNetworkURLLoaderFactory>();
+  SetNetworkFactory(default_network_loader_factory_.get());
 }
 
 void EmbeddedWorkerTestHelper::SetNetworkFactory(
diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc
index e85c388..75feaa44 100644
--- a/content/browser/service_worker/service_worker_browsertest.cc
+++ b/content/browser/service_worker/service_worker_browsertest.cc
@@ -433,10 +433,6 @@
   return http_response;
 }
 
-const char kNavigationPreloadAbortError[] =
-    "NetworkError: The service worker navigation preload request was cancelled "
-    "before 'preloadResponse' settled. If you intend to use 'preloadResponse', "
-    "use waitUntil() or respondWith() to wait for the promise to settle.";
 const char kNavigationPreloadNetworkError[] =
     "NetworkError: The service worker navigation preload request failed with "
     "a network error.";
@@ -1851,14 +1847,6 @@
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest, IdleTimerWithDevTools) {
   StartServerAndNavigateToSetup();
 
-  // This test is based on a new idle timer mechanism which is available only
-  // when S13nServiceWorker or NetworkService is enabled.
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    LOG(WARNING)
-        << "This test requires NetworkService or ServiceWorkerServicification.";
-    return;
-  }
-
   // Register a service worker.
   scoped_refptr<WorkerActivatedObserver> observer =
       new WorkerActivatedObserver(wrapper());
@@ -2503,46 +2491,6 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
-                       CanceledByInterceptor) {
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // This is a test for a ResourceDispatcherHost interceptor cancelling the
-    // Navigation Preload request. The analogue for the
-    // NetworkService/ServiceWorker*Loader code path would be throttles, but
-    // these don't see Navigation Preload (crbug.com/825717) and there is no
-    // plan to allow them to, so just skip this test.
-
-    // This has to be called so the EmbeddedTestServer IO Thread is created,
-    // otherwise we crash on destruction.
-    embedded_test_server()->StartAcceptingConnections();
-    return;
-  }
-
-  auto console_observer =
-      base::MakeRefCounted<ConsoleMessageContextObserver>(wrapper());
-  console_observer->Init();
-
-  content::ResourceDispatcherHost::Get()->RegisterInterceptor(
-      kNavigationPreloadHeaderName, "",
-      base::BindRepeating(&CancellingInterceptorCallback));
-
-  const char kPageUrl[] = "/service_worker/navigation_preload.html";
-  const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
-  const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
-  const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
-  RegisterStaticFile(
-      kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
-      "text/javascript");
-
-  EXPECT_EQ(kNavigationPreloadAbortError,
-            LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED"));
-
-  console_observer->WaitForConsoleMessages(1);
-  const base::string16 expected = base::ASCIIToUTF16("request was cancelled");
-  std::vector<base::string16> messages = console_observer->messages();
-  EXPECT_NE(base::string16::npos, messages[0].find(expected));
-}
-
-IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
                        PreloadHeadersSimple) {
   const char kPageUrl[] = "/service_worker/navigation_preload.html";
   const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
@@ -2774,57 +2722,6 @@
   EXPECT_EQ(1, GetRequestCount(kPageUrl + "?3"));
 }
 
-// When the content type of the page is not correctly set,
-// OnStartLoadingResponseBody() of network::mojom::URLLoaderClient is called
-// before OnReceiveResponse(). This behavior is caused by
-// MimeSniffingResourceHandler. This test checks that even if the
-// MimeSniffingResourceHandler is triggered navigation preload must be handled
-// correctly.
-IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
-                       RespondWithNavigationPreloadWithMimeSniffing) {
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // When S13nSW/NetworkService is enabled, we don't do MIME sniffing
-    // (https://crbug.com/771118), so just skip this test. Also, this test was
-    // meant to test an internal quirk of MimeSniffingResourceHandler, which
-    // might not make sense in the NetworkService implementation anyway. If we
-    // want a behavior test for MIME sniffing for navigation preload, it can be
-    // an end-to-end web test instead.
-
-    // This has to be called so the EmbeddedTestServer IO Thread is created,
-    // otherwise we crash on destruction.
-    embedded_test_server()->StartAcceptingConnections();
-    return;
-  }
-
-  const char kPageUrl[] = "/service_worker/navigation_preload.html";
-  const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
-  const char kPage[] = "<title>PASS</title>Hello world.";
-  const std::string kScript = kEnableNavigationPreloadScript +
-                              "self.addEventListener('fetch', event => {\n"
-                              "    event.respondWith(event.preloadResponse);\n"
-                              "  });";
-  const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
-  const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
-
-  // Setting an empty content type to trigger MimeSniffingResourceHandler.
-  RegisterStaticFile(kPageUrl, kPage, "");
-  RegisterStaticFile(kWorkerUrl, kScript, "text/javascript");
-
-  RegisterMonitorRequestHandler();
-  StartServerAndNavigateToSetup();
-  SetupForNavigationPreloadTest(page_url, worker_url);
-
-  const base::string16 title = base::ASCIIToUTF16("PASS");
-  TitleWatcher title_watcher(shell()->web_contents(), title);
-  NavigateToURL(shell(), page_url);
-  EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
-  EXPECT_EQ("Hello world.", GetTextContent());
-
-  // The page request must be sent only once, since the worker responded with
-  // the navigation preload response
-  EXPECT_EQ(1, GetRequestCount(kPageUrl));
-}
-
 IN_PROC_BROWSER_TEST_F(ServiceWorkerBrowserTest,
                        ResponseFromHTTPSServiceWorkerIsMarkedAsSecure) {
   StartServerAndNavigateToSetup();
@@ -3683,14 +3580,6 @@
 // observable inside the service worker's fetch event.
 IN_PROC_BROWSER_TEST_F(ServiceWorkerURLLoaderThrottleTest,
                        FetchEventForNavigationHasThrottledRequest) {
-  // This tests throttling behavior which only has an effect on service worker
-  // interception when servicification is on.
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    LOG(WARNING)
-        << "This test requires NetworkService or ServiceWorkerServicification.";
-    return;
-  }
-
   // Add a throttle which injects a header.
   ThrottlingContentBrowserClient content_browser_client;
   auto* old_content_browser_client =
@@ -3726,14 +3615,6 @@
 // Test that redirects by throttles occur before service worker interception.
 IN_PROC_BROWSER_TEST_F(ServiceWorkerURLLoaderThrottleTest,
                        RedirectOccursBeforeFetchEvent) {
-  // This tests throttling behavior which only has an effect on service worker
-  // interception when servicification is on.
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    LOG(WARNING)
-        << "This test requires NetworkService or ServiceWorkerServicification.";
-    return;
-  }
-
   // Add a throttle which performs a redirect.
   ThrottlingContentBrowserClient content_browser_client;
   auto* old_content_browser_client =
@@ -3779,14 +3660,6 @@
 IN_PROC_BROWSER_TEST_F(
     ServiceWorkerURLLoaderThrottleTest,
     NavigationHasThrottledRequestHeadersAfterNetworkFallback) {
-  // This tests throttling behavior which only has an effect on service worker
-  // interception when servicification is on.
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    LOG(WARNING)
-        << "This test requires NetworkService or ServiceWorkerServicification.";
-    return;
-  }
-
   // Add a throttle which injects a header.
   ThrottlingContentBrowserClient content_browser_client;
   auto* old_content_browser_client =
@@ -3817,14 +3690,6 @@
 // present in the navigation preload request.
 IN_PROC_BROWSER_TEST_F(ServiceWorkerURLLoaderThrottleTest,
                        NavigationPreloadHasThrottledRequestHeaders) {
-  // This tests throttling behavior which only has an effect on service worker
-  // interception when servicification is on.
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    LOG(WARNING)
-        << "This test requires NetworkService or ServiceWorkerServicification.";
-    return;
-  }
-
   // Add a throttle which injects a header.
   ThrottlingContentBrowserClient content_browser_client;
   auto* old_content_browser_client =
diff --git a/content/browser/service_worker/service_worker_context_core.h b/content/browser/service_worker/service_worker_context_core.h
index 24c3d3e..063223c 100644
--- a/content/browser/service_worker/service_worker_context_core.h
+++ b/content/browser/service_worker/service_worker_context_core.h
@@ -108,8 +108,6 @@
   // ServiceWorkerContextWrapper. When Notify() of |observer_list| is called in
   // ServiceWorkerContextCore, the methods of ServiceWorkerContextCoreObserver
   // will be called on the thread which called AddObserver() of |observer_list|.
-  // |url_loader_factory_getter| is used only when IsServicificationEnabled is
-  // true.
   ServiceWorkerContextCore(
       const base::FilePath& user_data_directory,
       scoped_refptr<base::SequencedTaskRunner> database_task_runner,
@@ -349,7 +347,6 @@
 
   std::map<int64_t /* version_id */, FailureInfo> failure_counts_;
 
-  // IsServicificationEnabled
   scoped_refptr<URLLoaderFactoryGetter> loader_factory_getter_;
 
   bool force_update_on_page_load_;
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h
index 163f971e..71cb400 100644
--- a/content/browser/service_worker/service_worker_context_wrapper.h
+++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -72,8 +72,6 @@
 
   // Init and Shutdown are for use on the UI thread when the profile,
   // storagepartition is being setup and torn down.
-  // |blob_context| and |url_loader_factory_getter| are used only
-  // when IsServicificationEnabled is true.
   void Init(const base::FilePath& user_data_directory,
             storage::QuotaManagerProxy* quota_manager_proxy,
             storage::SpecialStoragePolicy* special_storage_policy,
diff --git a/content/browser/service_worker/service_worker_fetch_dispatcher.cc b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
index 2d8a9f2..7890ca4 100644
--- a/content/browser/service_worker/service_worker_fetch_dispatcher.cc
+++ b/content/browser/service_worker/service_worker_fetch_dispatcher.cc
@@ -49,7 +49,6 @@
 #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
 #include "services/network/throttling/throttling_controller.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -475,10 +474,7 @@
       fetch_callback_(std::move(fetch_callback)),
       did_complete_(false),
       weak_factory_(this) {
-#if DCHECK_IS_ON()
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    DCHECK(!request_->blob);
-#endif  // DCHECK_IS_ON()
+  DCHECK(!request_->blob);
   TRACE_EVENT_NESTABLE_ASYNC_BEGIN1(
       "ServiceWorker", "ServiceWorkerFetchDispatcher::DispatchFetchEvent", this,
       "event_type", ServiceWorkerMetrics::EventTypeToString(GetEventType()));
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index 27c496b2..1908a81 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -36,7 +36,6 @@
 #include "net/base/test_completion_callback.h"
 #include "net/http/http_response_headers.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
@@ -1236,21 +1235,19 @@
   first_version->StartUpdate();
   base::RunLoop().RunUntilIdle();
 
-  // S13nServiceWorker: the worker is updated after RequestTermination() is
-  // called from the renderer. Until then, the active version stays active.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    EXPECT_EQ(first_version.get(), registration->active_version());
-    // The new worker is installed but not yet to be activated.
-    scoped_refptr<ServiceWorkerVersion> new_version =
-        registration->waiting_version();
-    EXPECT_EQ(2u, update_helper->attribute_change_log_.size());
-    UpdateJobTestHelper::UpdateJobEmbeddedWorkerInstanceClient* client =
-        update_helper->initial_embedded_worker_instance_client_;
-    RequestTermination(&client->host());
+  // The worker is updated after RequestTermination() is called from the
+  // renderer. Until then, the active version stays active.
+  EXPECT_EQ(first_version.get(), registration->active_version());
+  // The new worker is installed but not yet to be activated.
+  scoped_refptr<ServiceWorkerVersion> new_version =
+      registration->waiting_version();
+  EXPECT_EQ(2u, update_helper->attribute_change_log_.size());
+  UpdateJobTestHelper::UpdateJobEmbeddedWorkerInstanceClient* client =
+      update_helper->initial_embedded_worker_instance_client_;
+  RequestTermination(&client->host());
 
-    TestServiceWorkerObserver observer(helper_->context_wrapper());
-    observer.RunUntilActivated(new_version.get(), runner);
-  }
+  TestServiceWorkerObserver observer(helper_->context_wrapper());
+  observer.RunUntilActivated(new_version.get(), runner);
 
   // Pump the loop again. This ensures |update_helper| observes all
   // the status changes, since RunUntilActivated() only ensured
@@ -1367,21 +1364,19 @@
   // Run the update job.
   base::RunLoop().RunUntilIdle();
 
-  // S13nServiceWorker: the worker is activated after RequestTermination() is
-  // called from the renderer. Until then, the active version stays active.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // Still waiting, but the waiting version isn't |version| since another
-    // ServiceWorkerVersion is created during the update job and the job wipes
-    // out the older waiting version.
-    ServiceWorkerVersion* waiting_version = registration->waiting_version();
-    EXPECT_TRUE(registration->active_version());
-    EXPECT_TRUE(waiting_version);
-    EXPECT_NE(version.get(), waiting_version);
+  // The worker is activated after RequestTermination() is called from the
+  // renderer. Until then, the active version stays active.
+  // Still waiting, but the waiting version isn't |version| since another
+  // ServiceWorkerVersion is created during the update job and the job wipes
+  // out the older waiting version.
+  ServiceWorkerVersion* waiting_version = registration->waiting_version();
+  EXPECT_TRUE(registration->active_version());
+  EXPECT_TRUE(waiting_version);
+  EXPECT_NE(version.get(), waiting_version);
 
-    RequestTermination(&initial_client->host());
-    TestServiceWorkerObserver observer(helper_->context_wrapper());
-    observer.RunUntilActivated(waiting_version, runner);
-  }
+  RequestTermination(&initial_client->host());
+  TestServiceWorkerObserver observer(helper_->context_wrapper());
+  observer.RunUntilActivated(waiting_version, runner);
 
   // The update job should have created a new version with the new script,
   // and promoted it to the active version.
@@ -1496,8 +1491,7 @@
 
   // Make the old version eligible for eviction.
   old_version->RemoveControllee(host->client_uuid());
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    RequestTermination(&initial_client->host());
+  RequestTermination(&initial_client->host());
 
   // Wait for activated.
   TestServiceWorkerObserver observer(helper_->context_wrapper());
@@ -1600,8 +1594,7 @@
   EXPECT_EQ(new_version, registration->waiting_version());
 
   old_version->RemoveControllee(host->client_uuid());
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    RequestTermination(&initial_client->host());
+  RequestTermination(&initial_client->host());
 
   // Wait for activated.
   TestServiceWorkerObserver observer(helper_->context_wrapper());
@@ -1658,8 +1651,7 @@
   EXPECT_EQ(ServiceWorkerVersion::REDUNDANT, second_version->status());
 
   first_version->RemoveControllee(host->client_uuid());
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    RequestTermination(&initial_client->host());
+  RequestTermination(&initial_client->host());
 
   // Wait for activated.
   TestServiceWorkerObserver observer(helper_->context_wrapper());
@@ -1817,12 +1809,10 @@
   first_version->RemoveControllee(host->client_uuid());
   base::RunLoop().RunUntilIdle();
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // S13nServiceWorker: Activating the new version won't happen until
-    // RequestTermination() is called.
-    EXPECT_EQ(first_version.get(), registration->active_version());
-    RequestTermination(&initial_client->host());
-  }
+  // Activating the new version won't happen until
+  // RequestTermination() is called.
+  EXPECT_EQ(first_version.get(), registration->active_version());
+  RequestTermination(&initial_client->host());
 
   TestServiceWorkerObserver observer(helper_->context_wrapper());
   observer.RunUntilStatusChange(new_version.get(),
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc
index 386d74f..ddbfb93 100644
--- a/content/browser/service_worker/service_worker_metrics.cc
+++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -20,7 +20,6 @@
 #include "content/public/browser/content_browser_client.h"
 #include "content/public/common/content_client.h"
 #include "net/url_request/url_request.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -161,31 +160,6 @@
   return Preparation::UNKNOWN;
 }
 
-const char* GetWorkerPreparationSuffix(
-    ServiceWorkerMetrics::WorkerPreparationType status) {
-  using Preparation = ServiceWorkerMetrics::WorkerPreparationType;
-  switch (status) {
-    case Preparation::UNKNOWN:
-      break;
-    case Preparation::START_DURING_STARTUP:
-      return "_StartWorkerDuringStartup";
-    case Preparation::START_IN_NEW_PROCESS:
-      return "_StartWorkerNewProcess";
-    case Preparation::START_IN_EXISTING_UNREADY_PROCESS:
-      return "_StartWorkerExistingUnreadyProcess";
-    case Preparation::START_IN_EXISTING_READY_PROCESS:
-      return "_StartWorkerExistingReadyProcess";
-    case Preparation::STARTING:
-      return "_StartingWorker";
-    case Preparation::RUNNING:
-      return "_RunningWorker";
-    case Preparation::STOPPING:
-      return "_StoppingWorker";
-  }
-  NOTREACHED();
-  return "_UNKNOWN";
-}
-
 void RecordURLMetricOnUI(const std::string& metric_name, const GURL& url) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   GetContentClient()->browser()->RecordURLMetric(metric_name, url);
@@ -471,36 +445,6 @@
         "NavigationPreloadEnabled",
         preparation);
   }
-
-  // Don't record .Time if S13nServiceWorker is enabled.
-  // https://crbug.com/852664
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    return;
-
-  // Record the preparation time.
-  UMA_HISTOGRAM_MEDIUM_TIMES(
-      "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time", time);
-
-  // Record the preparation time using the worker preparation suffix.
-  base::UmaHistogramMediumTimes(
-      base::StrCat({"ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time",
-                    GetWorkerPreparationSuffix(preparation)}),
-      time);
-
-  // Record the preparation time using the navigation preload suffix.
-  if (did_navigation_preload) {
-    UMA_HISTOGRAM_MEDIUM_TIMES(
-        "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time_"
-        "NavigationPreloadEnabled",
-        time);
-    // We're mostly interested in when the worker needed to start up.
-    if (initial_worker_status != EmbeddedWorkerStatus::RUNNING) {
-      UMA_HISTOGRAM_MEDIUM_TIMES(
-          "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time_"
-          "WorkerStartOccurred_NavigationPreloadEnabled",
-          time);
-    }
-  }
 }
 
 void ServiceWorkerMetrics::RecordWorkerStopped(StopStatus status) {
diff --git a/content/browser/service_worker/service_worker_metrics_unittest.cc b/content/browser/service_worker/service_worker_metrics_unittest.cc
index 4a1afc8..11651ff 100644
--- a/content/browser/service_worker/service_worker_metrics_unittest.cc
+++ b/content/browser/service_worker/service_worker_metrics_unittest.cc
@@ -8,7 +8,6 @@
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/test/test_content_browser_client.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -97,15 +96,6 @@
         kPreparationType, static_cast<int>(WorkerPreparationType::STARTING), 1);
     histogram_tester.ExpectTotalCount(
         kPreparationType + kNavigationPreloadSuffix, 0);
-
-    // We don't record .Time histograms when S13nServiceWorker is enabled.
-    if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-      histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
-      histogram_tester.ExpectTimeBucketCount(
-          kPreparationTime + "_StartingWorker", time, 1);
-      histogram_tester.ExpectTotalCount(
-          kPreparationTime + kNavigationPreloadSuffix, 0);
-    }
   }
 
   {
@@ -120,16 +110,6 @@
     histogram_tester.ExpectUniqueSample(
         kPreparationType + kNavigationPreloadSuffix,
         static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1);
-
-    // We don't record .Time histograms when S13nServiceWorker is enabled.
-    if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-      histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
-      histogram_tester.ExpectTimeBucketCount(
-          kPreparationTime + kNavigationPreloadSuffix, time, 1);
-      histogram_tester.ExpectTotalCount(
-          kPreparationTime + kWorkerStartOccurred + kNavigationPreloadSuffix,
-          1);
-    }
   }
 
   {
@@ -149,16 +129,6 @@
         static_cast<int>(
             WorkerPreparationType::START_IN_EXISTING_READY_PROCESS),
         1);
-
-    // We don't record .Time histograms when S13nServiceWorker is enabled.
-    if (!blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-      histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
-      histogram_tester.ExpectTimeBucketCount(
-          kPreparationTime + kNavigationPreloadSuffix, time, 1);
-      histogram_tester.ExpectTimeBucketCount(
-          kPreparationTime + kWorkerStartOccurred + kNavigationPreloadSuffix,
-          time, 1);
-    }
   }
 
   // Suffixed metric test.
diff --git a/content/browser/service_worker/service_worker_provider_host.cc b/content/browser/service_worker/service_worker_provider_host.cc
index f1c2138..cf41e035 100644
--- a/content/browser/service_worker/service_worker_provider_host.cc
+++ b/content/browser/service_worker/service_worker_provider_host.cc
@@ -301,13 +301,6 @@
   service_worker_object_hosts_.clear();
   registration_object_hosts_.clear();
 
-  // This host may be destroyed before it received the anticipated
-  // HintToUpdateServiceWorker IPC from the renderer. This can occur on
-  // navigation failure or if the frame closed soon after navigation. The
-  // PendingVersionUpdate objects decrement the hint count upon destruction.
-  DCHECK(versions_to_update_.empty() ||
-         blink::ServiceWorkerUtils::IsServicificationEnabled());
-
   // Ensure callbacks awaiting execution ready are notified.
   RunExecutionReadyCallbacks();
 }
@@ -387,7 +380,6 @@
 
 blink::mojom::ControllerServiceWorkerPtr
 ServiceWorkerProviderHost::GetControllerServiceWorkerPtr() {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK(controller_);
   if (controller_->fetch_handler_existence() ==
       ServiceWorkerVersion::FetchHandlerExistence::DOES_NOT_EXIST) {
@@ -597,7 +589,6 @@
 
 void ServiceWorkerProviderHost::AddServiceWorkerToUpdate(
     scoped_refptr<ServiceWorkerVersion> version) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   // This is only called for windows now, but it should be called for all
   // clients someday.
   DCHECK_EQ(provider_type(),
@@ -729,16 +720,14 @@
   DCHECK_NE(ChildProcessHost::kInvalidUniqueID, process_id);
   render_process_id_ = process_id;
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    network::mojom::URLLoaderFactoryAssociatedPtrInfo
-        script_loader_factory_ptr_info;
-    mojo::MakeStrongAssociatedBinding(
-        std::make_unique<ServiceWorkerScriptLoaderFactory>(
-            context_, AsWeakPtr(), std::move(loader_factory)),
-        mojo::MakeRequest(&script_loader_factory_ptr_info));
-    provider_info->script_loader_factory_ptr_info =
-        std::move(script_loader_factory_ptr_info);
-  }
+  network::mojom::URLLoaderFactoryAssociatedPtrInfo
+      script_loader_factory_ptr_info;
+  mojo::MakeStrongAssociatedBinding(
+      std::make_unique<ServiceWorkerScriptLoaderFactory>(
+          context_, AsWeakPtr(), std::move(loader_factory)),
+      mojo::MakeRequest(&script_loader_factory_ptr_info));
+  provider_info->script_loader_factory_ptr_info =
+      std::move(script_loader_factory_ptr_info);
 
   interface_provider_binding_.Bind(FilterRendererExposedInterfaces(
       blink::mojom::kNavigation_ServiceWorkerSpec, process_id,
@@ -839,10 +828,8 @@
 
   controller_info->mode = GetControllerMode();
 
-  // S13nServiceWorker: Pass an endpoint for the client to talk to this
-  // controller.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    controller_info->endpoint = GetControllerServiceWorkerPtr().PassInterface();
+  // Pass an endpoint for the client to talk to this controller.
+  controller_info->endpoint = GetControllerServiceWorkerPtr().PassInterface();
 
   // Set the info for the JavaScript ServiceWorkerContainer#controller object.
   base::WeakPtr<ServiceWorkerObjectHost> object_host =
@@ -1156,7 +1143,6 @@
 void ServiceWorkerProviderHost::StartControllerComplete(
     blink::mojom::ControllerServiceWorkerRequest controller_request,
     blink::ServiceWorkerStatusCode status) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   if (status == blink::ServiceWorkerStatusCode::kOk)
     controller_->controller()->Clone(std::move(controller_request));
 }
@@ -1168,7 +1154,6 @@
   if (!IsContextAlive() || !controller_)
     return;
 
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   controller_->RunAfterStartWorker(
       PurposeToEventType(purpose),
       base::BindOnce(&ServiceWorkerProviderHost::StartControllerComplete,
@@ -1177,7 +1162,6 @@
 
 void ServiceWorkerProviderHost::CloneContainerHost(
     blink::mojom::ServiceWorkerContainerHostRequest container_host_request) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   additional_bindings_.AddBinding(this, std::move(container_host_request));
 }
 
@@ -1186,7 +1170,6 @@
 }
 
 void ServiceWorkerProviderHost::HintToUpdateServiceWorker() {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   if (!IsProviderForClient()) {
     mojo::ReportBadMessage("SWPH_HTUSW_NOT_CLIENT");
     return;
diff --git a/content/browser/service_worker/service_worker_registration.cc b/content/browser/service_worker/service_worker_registration.cc
index cb3862b..c9c8cb66 100644
--- a/content/browser/service_worker/service_worker_registration.cc
+++ b/content/browser/service_worker/service_worker_registration.cc
@@ -16,7 +16,6 @@
 #include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/browser/service_worker/service_worker_register_job.h"
 #include "content/public/browser/browser_thread.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 
 namespace content {
@@ -216,8 +215,7 @@
   }
 
   if (IsLameDuckActiveVersion()) {
-    if (blink::ServiceWorkerUtils::IsServicificationEnabled() &&
-        active_version()->running_status() == EmbeddedWorkerStatus::RUNNING) {
+    if (active_version()->running_status() == EmbeddedWorkerStatus::RUNNING) {
       // If the waiting worker is ready and the active worker needs to be
       // swapped out, ask the active worker to trigger idle timer as soon as
       // possible.
@@ -298,8 +296,7 @@
   }
 
   if (IsLameDuckActiveVersion()) {
-    if (blink::ServiceWorkerUtils::IsServicificationEnabled() &&
-        should_activate_when_ready_ &&
+    if (should_activate_when_ready_ &&
         active_version()->running_status() == EmbeddedWorkerStatus::RUNNING) {
       // If the waiting worker is ready and the active worker needs to be
       // swapped out, ask the active worker to trigger idle timer as soon as
diff --git a/content/browser/service_worker/service_worker_registration_unittest.cc b/content/browser/service_worker/service_worker_registration_unittest.cc
index 1b672b0..07a587f8 100644
--- a/content/browser/service_worker/service_worker_registration_unittest.cc
+++ b/content/browser/service_worker/service_worker_registration_unittest.cc
@@ -35,7 +35,6 @@
 #include "content/test/test_content_browser_client.h"
 #include "mojo/core/embedder/embedder.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_object.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
 #include "url/gurl.h"
@@ -554,42 +553,18 @@
   version_1->RemoveControllee(controllee()->client_uuid());
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(version_1.get(), reg->active_version());
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
+  EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
 
   // Finish the request. Activation should happen.
   version_1->FinishRequest(inflight_request_id(), true /* was_handled */);
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    EXPECT_EQ(version_1.get(), reg->active_version());
-    RequestTermination(&version_1_client()->host());
-  }
+  EXPECT_EQ(version_1.get(), reg->active_version());
+  RequestTermination(&version_1_client()->host());
+
   TestServiceWorkerObserver observer(helper_->context_wrapper());
   observer.RunUntilActivated(version_2.get(), runner);
   EXPECT_EQ(version_2.get(), reg->active_version());
 }
 
-// Test activation triggered by loss of controllee.
-TEST_P(ServiceWorkerActivationTest, NoControllee) {
-  // S13nServiceWorker: activation only happens when the service worker reports
-  // it's idle, so this test doesn't make sense.
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    return;
-  scoped_refptr<ServiceWorkerRegistration> reg = registration();
-  scoped_refptr<ServiceWorkerVersion> version_1 = reg->active_version();
-  scoped_refptr<ServiceWorkerVersion> version_2 = reg->waiting_version();
-
-  // Finish the request. Since there is a controllee, activation should not yet
-  // happen.
-  version_1->FinishRequest(inflight_request_id(), true /* was_handled */);
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(version_1.get(), reg->active_version());
-
-  // Remove the controllee. Activation should happen.
-  version_1->RemoveControllee(controllee()->client_uuid());
-  base::RunLoop().RunUntilIdle();
-  EXPECT_EQ(version_2.get(), reg->active_version());
-}
-
 // Test activation triggered by skipWaiting and finishing requests.
 TEST_P(ServiceWorkerActivationTest, SkipWaitingWithInflightRequest) {
   scoped_refptr<ServiceWorkerRegistration> reg = registration();
@@ -604,8 +579,7 @@
                                   skip_waiting_loop.QuitClosure());
   EXPECT_FALSE(result.has_value());
   EXPECT_EQ(version_1.get(), reg->active_version());
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled())
-    EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
+  EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
 
   // Finish the request.
   // non-S13nServiceWorker: The service worker becomes idle.
@@ -614,10 +588,8 @@
   // RequestTermination().
   version_1->FinishRequest(inflight_request_id(), true /* was_handled */);
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    EXPECT_EQ(version_1.get(), reg->active_version());
-    RequestTermination(&version_1_client()->host());
-  }
+  EXPECT_EQ(version_1.get(), reg->active_version());
+  RequestTermination(&version_1_client()->host());
 
   // Wait until SkipWaiting resolves.
   skip_waiting_loop.Run();
@@ -648,12 +620,10 @@
   SimulateSkipWaitingWithCallback(version_2.get(), &result,
                                   skip_waiting_loop.QuitClosure());
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
-    EXPECT_FALSE(result.has_value());
-    EXPECT_EQ(version_1.get(), reg->active_version());
-    RequestTermination(&version_1_client()->host());
-  }
+  EXPECT_TRUE(version_1_service_worker()->is_zero_idle_timer_delay());
+  EXPECT_FALSE(result.has_value());
+  EXPECT_EQ(version_1.get(), reg->active_version());
+  RequestTermination(&version_1_client()->host());
 
   // Wait until SkipWaiting resolves.
   skip_waiting_loop.Run();
diff --git a/content/browser/service_worker/service_worker_request_handler.cc b/content/browser/service_worker/service_worker_request_handler.cc
index eb11e70b..a6273ef 100644
--- a/content/browser/service_worker/service_worker_request_handler.cc
+++ b/content/browser/service_worker/service_worker_request_handler.cc
@@ -26,7 +26,6 @@
 #include "net/base/url_util.h"
 #include "services/network/public/cpp/resource_request_body.h"
 #include "storage/browser/blob/blob_storage_context.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -57,7 +56,6 @@
     scoped_refptr<network::ResourceRequestBody> body,
     base::RepeatingCallback<WebContents*()> web_contents_getter,
     base::WeakPtr<ServiceWorkerProviderHost>* out_provider_host) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK(navigation_handle_core);
 
   // Create the handler even for insecure HTTP since it's used in the
@@ -101,7 +99,6 @@
 ServiceWorkerRequestHandler::InitializeForWorker(
     const network::ResourceRequest& resource_request,
     base::WeakPtr<ServiceWorkerProviderHost> host) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK(resource_request.resource_type == RESOURCE_TYPE_WORKER ||
          resource_request.resource_type == RESOURCE_TYPE_SHARED_WORKER)
       << resource_request.resource_type;
diff --git a/content/browser/service_worker/service_worker_script_loader_factory.cc b/content/browser/service_worker/service_worker_script_loader_factory.cc
index b24330f9..24cc9a98 100644
--- a/content/browser/service_worker/service_worker_script_loader_factory.cc
+++ b/content/browser/service_worker/service_worker_script_loader_factory.cc
@@ -44,10 +44,7 @@
     const network::ResourceRequest& resource_request,
     network::mojom::URLLoaderClientPtr client,
     const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   if (!CheckIfScriptRequestIsValid(resource_request)) {
-    // TODO(kinuko): Record the reason like what we do with netlog in
-    // ServiceWorkerContextRequestHandler.
     client->OnComplete(network::URLLoaderCompletionStatus(net::ERR_ABORTED));
     return;
   }
diff --git a/content/browser/service_worker/service_worker_test_utils.cc b/content/browser/service_worker/service_worker_test_utils.cc
index 89a9b4cf..c4e7b54f 100644
--- a/content/browser/service_worker/service_worker_test_utils.cc
+++ b/content/browser/service_worker/service_worker_test_utils.cc
@@ -24,7 +24,6 @@
 #include "net/base/io_buffer.h"
 #include "net/base/test_completion_callback.h"
 #include "net/http/http_response_info.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -264,11 +263,9 @@
           std::move(context), base::WrapRefCounted(hosted_version),
           &provider_info);
 
-  scoped_refptr<network::SharedURLLoaderFactory> loader_factory;
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    loader_factory = network::SharedURLLoaderFactory::Create(
-        std::make_unique<MockSharedURLLoaderFactoryInfo>());
-  }
+  scoped_refptr<network::SharedURLLoaderFactory> loader_factory =
+      network::SharedURLLoaderFactory::Create(
+          std::make_unique<MockSharedURLLoaderFactoryInfo>());
 
   provider_info = host->CompleteStartWorkerPreparation(
       process_id, loader_factory, std::move(provider_info));
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index b41bc4e..aa630b716 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -897,8 +897,6 @@
 }
 
 bool ServiceWorkerVersion::HasNoWork() const {
-  if (!blink::ServiceWorkerUtils::IsServicificationEnabled())
-    return !HasWorkInBrowser();
   return !HasWorkInBrowser() && worker_is_idle_on_renderer_;
 }
 
@@ -1475,12 +1473,10 @@
 }
 
 void ServiceWorkerVersion::IncrementPendingUpdateHintCount() {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   pending_update_hint_count_++;
 }
 
 void ServiceWorkerVersion::DecrementPendingUpdateHintCount() {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   DCHECK_GT(pending_update_hint_count_, 0);
   pending_update_hint_count_--;
   if (pending_update_hint_count_ == 0)
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index 1ab42d9..d3b88fd4 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -34,7 +34,6 @@
 #include "content/public/test/test_utils.h"
 #include "mojo/public/cpp/bindings/strong_binding.h"
 #include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
 #include "third_party/blink/public/mojom/service_worker/service_worker_installed_scripts_manager.mojom.h"
@@ -332,18 +331,11 @@
   EXPECT_TRUE(version_->HasNoWork());
   SimulateDispatchEvent(ServiceWorkerMetrics::EventType::INSTALL);
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // The worker may still be handling events dispatched directly from
-    // controllees. We cannot say the version doesn't handle any tasks until the
-    // worker reports "No Work" (= ServiceWorkerVersion::OnRequestTermination()
-    // is called).
-    EXPECT_FALSE(version_->HasNoWork());
-  } else {
-    // In non-S13nServiceWorker case, ServiceWorkerVersion manages all of events
-    // dispatched to the service worker. Once all events have finished in the
-    // browser, the version should have no work.
-    EXPECT_TRUE(version_->HasNoWork());
-  }
+  // The worker may still be handling events dispatched directly from
+  // controllees. We cannot say the version doesn't handle any tasks until the
+  // worker reports "No Work" (= ServiceWorkerVersion::OnRequestTermination()
+  // is called).
+  EXPECT_FALSE(version_->HasNoWork());
 
   // The worker should be now started.
   EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
@@ -354,18 +346,11 @@
   SimulateDispatchEvent(ServiceWorkerMetrics::EventType::INSTALL);
   EXPECT_TRUE(has_stopped);
 
-  if (blink::ServiceWorkerUtils::IsServicificationEnabled()) {
-    // The worker may still be handling events dispatched directly from
-    // controllees. We cannot say the version doesn't handle any tasks until the
-    // worker reports "No Work" (= ServiceWorkerVersion::OnRequestTermination()
-    // is called).
-    EXPECT_FALSE(version_->HasNoWork());
-  } else {
-    // In non-S13nServiceWorker case, ServiceWorkerVersion manages all of events
-    // dispatched to the service worker. Once all events have finished in the
-    // browser, the version should have no work.
-    EXPECT_TRUE(version_->HasNoWork());
-  }
+  // The worker may still be handling events dispatched directly from
+  // controllees. We cannot say the version doesn't handle any tasks until the
+  // worker reports "No Work" (= ServiceWorkerVersion::OnRequestTermination()
+  // is called).
+  EXPECT_FALSE(version_->HasNoWork());
 
   // The worker should be now started again.
   EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
diff --git a/content/browser/webrtc/webrtc_internals.cc b/content/browser/webrtc/webrtc_internals.cc
index c0d0ace6..2b3666be 100644
--- a/content/browser/webrtc/webrtc_internals.cc
+++ b/content/browser/webrtc/webrtc_internals.cc
@@ -282,6 +282,7 @@
   dict->SetInteger("rid", rid);
   dict->SetInteger("pid", static_cast<int>(pid));
   dict->SetString("origin", origin);
+  dict->SetDouble("timestamp", base::Time::Now().ToJsTime());
   if (audio)
     dict->SetString("audio", audio_constraints);
   if (video)
diff --git a/content/browser/worker_host/worker_script_loader.cc b/content/browser/worker_host/worker_script_loader.cc
index ad71e04..1c2a5c6 100644
--- a/content/browser/worker_host/worker_script_loader.cc
+++ b/content/browser/worker_host/worker_script_loader.cc
@@ -13,7 +13,6 @@
 #include "content/public/browser/resource_context.h"
 #include "net/url_request/redirect_util.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -41,8 +40,6 @@
       traffic_annotation_(traffic_annotation),
       url_loader_client_binding_(this),
       weak_factory_(this) {
-  DCHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
-
   if (service_worker_provider_host_) {
     std::unique_ptr<NavigationLoaderInterceptor> service_worker_interceptor =
         ServiceWorkerRequestHandler::InitializeForWorker(
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc
index 6a293b6..57629dd6 100644
--- a/content/child/runtime_features.cc
+++ b/content/child/runtime_features.cc
@@ -66,10 +66,6 @@
   WebRuntimeFeatures::EnableBlinkHeapIncrementalMarking(
       base::FeatureList::IsEnabled(features::kBlinkHeapIncrementalMarking));
 
-  WebRuntimeFeatures::EnableBlinkHeapUnifiedGarbageCollection(
-      base::FeatureList::IsEnabled(
-          features::kBlinkHeapUnifiedGarbageCollection));
-
   if (base::FeatureList::IsEnabled(features::kBloatedRendererDetection))
     WebRuntimeFeatures::EnableBloatedRendererDetection(true);
 
diff --git a/content/public/browser/browser_thread.h b/content/public/browser/browser_thread.h
index c2b7716e..8a83217e 100644
--- a/content/public/browser/browser_thread.h
+++ b/content/public/browser/browser_thread.h
@@ -140,9 +140,9 @@
   // creating thread etc). Note: see base::OnTaskRunnerDeleter and
   // base::RefCountedDeleteOnSequence to bind to SequencedTaskRunner instead of
   // specific BrowserThreads.
-  template<ID thread>
+  template <ID thread>
   struct DeleteOnThread {
-    template<typename T>
+    template <typename T>
     static void Destruct(const T* x) {
       if (CurrentlyOn(thread)) {
         delete x;
@@ -180,12 +180,24 @@
   //
   // Note: see base::OnTaskRunnerDeleter and base::RefCountedDeleteOnSequence to
   // bind to SequencedTaskRunner instead of specific BrowserThreads.
-  struct DeleteOnUIThread : public DeleteOnThread<UI> { };
-  struct DeleteOnIOThread : public DeleteOnThread<IO> { };
+  struct DeleteOnUIThread : public DeleteOnThread<UI> {};
+  struct DeleteOnIOThread : public DeleteOnThread<IO> {};
 
   // Returns an appropriate error message for when DCHECK_CURRENTLY_ON() fails.
   static std::string GetDCheckCurrentlyOnErrorMessage(ID expected);
 
+  // Runs all pending tasks for the given thread. Tasks posted after this method
+  // is called (in particular any task posted from within any of the pending
+  // tasks) will be queued but not run. Conceptually this call will disable all
+  // queues, run any pending tasks, and re-enable all the queues.
+  //
+  // If any of the pending tasks posted a task, these could be run by calling
+  // this method again or running a regular RunLoop. But if that were the case
+  // you should probably rewrite you tests to wait for a specific event instead.
+  //
+  // NOTE: Can only be called from the UI thread.
+  static void RunAllPendingTasksOnThreadForTesting(ID identifier);
+
  protected:
   // For DeleteSoon(). Requires that the BrowserThread with the provided
   // |identifier| was started.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc
index cf243ef..bf185c6 100644
--- a/content/public/common/content_features.cc
+++ b/content/public/common/content_features.cc
@@ -64,10 +64,6 @@
 const base::Feature kBlinkHeapIncrementalMarking{
     "BlinkHeapIncrementalMarking", base::FEATURE_ENABLED_BY_DEFAULT};
 
-// Enable unified garbage collection in Blink.
-const base::Feature kBlinkHeapUnifiedGarbageCollection{
-    "BlinkHeapUnifiedGarbageCollection", base::FEATURE_ENABLED_BY_DEFAULT};
-
 // Enable bloated renderer detection.
 const base::Feature kBloatedRendererDetection{
     "BloatedRendererDetection", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h
index 1b33dfe..376d083 100644
--- a/content/public/common/content_features.h
+++ b/content/public/common/content_features.h
@@ -29,7 +29,6 @@
 CONTENT_EXPORT extern const base::Feature kBackgroundFetch;
 CONTENT_EXPORT extern const base::Feature kBackForwardCache;
 CONTENT_EXPORT extern const base::Feature kBlinkHeapIncrementalMarking;
-CONTENT_EXPORT extern const base::Feature kBlinkHeapUnifiedGarbageCollection;
 CONTENT_EXPORT extern const base::Feature kBloatedRendererDetection;
 CONTENT_EXPORT extern const base::Feature kBlockCredentialedSubresources;
 CONTENT_EXPORT extern const base::Feature kBrotliEncoding;
diff --git a/content/public/test/test_utils.cc b/content/public/test/test_utils.cc
index edb5904b..7842985 100644
--- a/content/public/test/test_utils.cc
+++ b/content/public/test/test_utils.cc
@@ -17,6 +17,7 @@
 #include "base/single_thread_task_runner.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/post_task.h"
+#include "base/task/sequence_manager/sequence_manager.h"
 #include "base/task/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
@@ -28,6 +29,7 @@
 #include "content/public/browser/browser_child_process_host_iterator.h"
 #include "content/public/browser/browser_plugin_guest_delegate.h"
 #include "content/public/browser/browser_task_traits.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/browser/notification_service.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
@@ -128,31 +130,14 @@
 
 void RunAllPendingInMessageLoop() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  base::RunLoop run_loop;
-  base::ThreadTaskRunnerHandle::Get()->PostTask(
-      FROM_HERE, GetDeferredQuitTaskForRunLoop(&run_loop));
-  RunThisRunLoop(&run_loop);
+  RunAllPendingInMessageLoop(BrowserThread::UI);
 }
 
 void RunAllPendingInMessageLoop(BrowserThread::ID thread_id) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  if (thread_id == BrowserThread::UI) {
-    RunAllPendingInMessageLoop();
-    return;
+  // See comment for |kNumQuitDeferrals| for why this is needed.
+  for (int i = 0; i <= kNumQuitDeferrals; ++i) {
+    BrowserThread::RunAllPendingTasksOnThreadForTesting(thread_id);
   }
-
-  // Post a DeferredQuitRunLoop() task to |thread_id|. Then, run a RunLoop on
-  // this thread. When a few generations of pending tasks have run on
-  // |thread_id|, a task will be posted to this thread to exit the RunLoop.
-  base::RunLoop run_loop;
-  const base::Closure post_quit_run_loop_to_ui_thread = base::Bind(
-      base::IgnoreResult(&base::SingleThreadTaskRunner::PostTask),
-      base::ThreadTaskRunnerHandle::Get(), FROM_HERE, run_loop.QuitClosure());
-  base::PostTaskWithTraits(
-      FROM_HERE, {thread_id},
-      base::BindOnce(&DeferredQuitRunLoop, post_quit_run_loop_to_ui_thread,
-                     kNumQuitDeferrals));
-  RunThisRunLoop(&run_loop);
 }
 
 void RunAllTasksUntilIdle() {
diff --git a/content/renderer/compositor/layer_tree_view.cc b/content/renderer/compositor/layer_tree_view.cc
index e08c503c..bbcd3f8 100644
--- a/content/renderer/compositor/layer_tree_view.cc
+++ b/content/renderer/compositor/layer_tree_view.cc
@@ -235,6 +235,10 @@
   return layer_tree_host_->GetSettings().enable_surface_synchronization;
 }
 
+void LayerTreeView::SetNeedsForcedRedraw() {
+  layer_tree_host_->SetNeedsCommitWithForcedRedraw();
+}
+
 std::unique_ptr<cc::SwapPromiseMonitor>
 LayerTreeView::CreateLatencyInfoSwapPromiseMonitor(ui::LatencyInfo* latency) {
   return std::make_unique<cc::LatencyInfoSwapPromiseMonitor>(
@@ -329,6 +333,14 @@
   return layer_tree_host_->have_scroll_event_handlers();
 }
 
+bool LayerTreeView::CompositeIsSynchronous() const {
+  if (!compositor_thread_) {
+    DCHECK(!layer_tree_host_->GetSettings().single_thread_proxy_scheduler);
+    return true;
+  }
+  return false;
+}
+
 void LayerTreeView::SetLayerTreeFrameSink(
     std::unique_ptr<cc::LayerTreeFrameSink> layer_tree_frame_sink) {
   if (!layer_tree_frame_sink) {
@@ -338,6 +350,26 @@
   layer_tree_host_->SetLayerTreeFrameSink(std::move(layer_tree_frame_sink));
 }
 
+void LayerTreeView::SynchronouslyComposite(bool raster) {
+  DCHECK(CompositeIsSynchronous());
+  if (!layer_tree_host_->IsVisible())
+    return;
+
+  if (in_synchronous_compositor_update_) {
+    // Web tests can use a nested message loop to pump frames while inside a
+    // frame, but the compositor does not support this. In this case, we only
+    // run blink's lifecycle updates.
+    delegate_->BeginMainFrame(base::TimeTicks::Now());
+    delegate_->UpdateVisualState();
+    return;
+  }
+
+  DCHECK(!in_synchronous_compositor_update_);
+  base::AutoReset<bool> inside_composite(&in_synchronous_compositor_update_,
+                                         true);
+  layer_tree_host_->Composite(base::TimeTicks::Now(), raster);
+}
+
 std::unique_ptr<cc::ScopedDeferMainFrameUpdate>
 LayerTreeView::DeferMainFrameUpdate() {
   return layer_tree_host_->DeferMainFrameUpdate();
@@ -372,6 +404,40 @@
   layer_tree_host_->SetBrowserControlsShownRatio(ratio);
 }
 
+void LayerTreeView::RequestDecode(const cc::PaintImage& image,
+                                  base::OnceCallback<void(bool)> callback) {
+  layer_tree_host_->QueueImageDecode(image, std::move(callback));
+
+  // If we're compositing synchronously, the SetNeedsCommit call which will be
+  // issued by |layer_tree_host_| is not going to cause a commit, due to the
+  // fact that this would make web tests slow and cause flakiness. However,
+  // in this case we actually need a commit to transfer the decode requests to
+  // the impl side. So, force a commit to happen.
+  if (CompositeIsSynchronous()) {
+    const bool raster = true;
+    layer_tree_host_->GetTaskRunnerProvider()->MainThreadTaskRunner()->PostTask(
+        FROM_HERE, base::BindOnce(&LayerTreeView::SynchronouslyComposite,
+                                  weak_factory_.GetWeakPtr(), raster));
+  }
+}
+
+void LayerTreeView::RequestPresentationCallback(base::OnceClosure callback) {
+  layer_tree_host_->RequestPresentationTimeForNextFrame(base::BindOnce(
+      [](base::OnceClosure callback,
+         const gfx::PresentationFeedback& feedback) {
+        std::move(callback).Run();
+      },
+      std::move(callback)));
+  SetNeedsForcedRedraw();
+  if (CompositeIsSynchronous()) {
+    main_thread_->PostTask(
+        FROM_HERE, base::BindOnce(&LayerTreeView::SynchronouslyComposite,
+                                  weak_factory_.GetWeakPtr(), /*raster=*/true));
+  } else {
+    layer_tree_host_->SetNeedsCommit();
+  }
+}
+
 void LayerTreeView::SetOverscrollBehavior(
     const cc::OverscrollBehavior& behavior) {
   layer_tree_host_->SetOverscrollBehavior(behavior);
diff --git a/content/renderer/compositor/layer_tree_view.h b/content/renderer/compositor/layer_tree_view.h
index a044b38f..5a73dbe 100644
--- a/content/renderer/compositor/layer_tree_view.h
+++ b/content/renderer/compositor/layer_tree_view.h
@@ -89,6 +89,9 @@
   // WebWidgetClient::ScheduleAnimate() instead, or they can bypass test
   // overrides.
   void SetNeedsBeginFrame();
+  // Like SetNeedsRedraw but forces the frame to be drawn, without early-outs.
+  // Redraw will be forced after the next commit
+  void SetNeedsForcedRedraw();
   // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped
   // LatencyInfoSwapPromiseMonitor. During the life time of the
   // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or
@@ -152,6 +155,9 @@
                                 float bottom_height,
                                 bool shrink) override;
   void SetBrowserControlsShownRatio(float) override;
+  void RequestDecode(const cc::PaintImage& image,
+                     base::OnceCallback<void(bool)> callback) override;
+  void RequestPresentationCallback(base::OnceClosure callback) override;
 
   void SetOverscrollBehavior(const cc::OverscrollBehavior&) override;
 
@@ -194,6 +200,11 @@
 
   const cc::LayerTreeSettings& GetLayerTreeSettings() const;
 
+  // Performs a composite including a main frame and all lifecycle stages,
+  // immediately and synchronously. Should only be called in testing, when
+  // CompositeIsSynchronous() is true.
+  void SynchronouslyComposite(bool raster);
+
   // Sets the RenderFrameMetadataObserver, which is sent to the compositor
   // thread for binding.
   void SetRenderFrameObserver(
@@ -205,12 +216,18 @@
 
   cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
 
+  // Exposed for the WebTest harness to query.
+  bool CompositeIsSynchronousForTesting() const {
+    return CompositeIsSynchronous();
+  }
+
  protected:
   friend class RenderViewImplScaleFactorTest;
 
  private:
   void SetLayerTreeFrameSink(
       std::unique_ptr<cc::LayerTreeFrameSink> layer_tree_frame_sink);
+  bool CompositeIsSynchronous() const;
 
   LayerTreeViewDelegate* const delegate_;
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
@@ -222,6 +239,8 @@
 
   bool layer_tree_frame_sink_request_failed_while_invisible_ = false;
 
+  bool in_synchronous_compositor_update_ = false;
+
   viz::FrameSinkId frame_sink_id_;
   base::circular_deque<
       std::pair<uint32_t,
diff --git a/content/renderer/compositor/layer_tree_view_unittest.cc b/content/renderer/compositor/layer_tree_view_unittest.cc
index 70859507..431243c 100644
--- a/content/renderer/compositor/layer_tree_view_unittest.cc
+++ b/content/renderer/compositor/layer_tree_view_unittest.cc
@@ -423,8 +423,7 @@
           std::move(callback).Run();
         },
         run_loop.QuitClosure(), &swap_time));
-    layer_tree_view_.layer_tree_host()->Composite(base::TimeTicks::Now(),
-                                                  /*raster=*/true);
+    layer_tree_view_.SynchronouslyComposite(/*raster=*/true);
     // The swap time notify comes as a posted task.
     run_loop.Run();
     return swap_time;
diff --git a/content/renderer/media/stream/media_stream_constraints_util_audio.cc b/content/renderer/media/stream/media_stream_constraints_util_audio.cc
index a1045468..d16ecd54 100644
--- a/content/renderer/media/stream/media_stream_constraints_util_audio.cc
+++ b/content/renderer/media/stream/media_stream_constraints_util_audio.cc
@@ -617,6 +617,30 @@
 // APM, processed without APM, and unprocessed.
 class ProcessingBasedContainer {
  public:
+  static ProcessingBasedContainer CreateRemoteApmProcessedContainer(
+      const SourceInfo& source_info,
+      bool is_device_capture,
+      const media::AudioParameters& device_parameters) {
+    return ProcessingBasedContainer(
+        ProcessingType::kApmProcessed,
+        {EchoCancellationType::kEchoCancellationAec3,
+         EchoCancellationType::kEchoCancellationDisabled},
+        BoolSet(), /* goog_audio_mirroring_set */
+        BoolSet(), /* goog_auto_gain_control_set */
+        BoolSet(), /* goog_experimental_echo_cancellation_set */
+        BoolSet(), /* goog_typing_noise_detection_set */
+        BoolSet(), /* goog_noise_suppression_set */
+        BoolSet(), /* goog_experimental_noise_suppression_set */
+        BoolSet(), /* goog_highpass_filter_set */
+        BoolSet(), /* goog_experimental_auto_gain_control_set */
+        IntRangeSet::FromValue(GetSampleSize()), /* sample_size_range */
+        IntRangeSet::FromValue(
+            device_parameters.channels()), /* channels_range */
+        IntRangeSet::FromValue(
+            device_parameters.sample_rate()), /* sample_rate_range */
+        source_info, is_device_capture, device_parameters);
+  }
+
   // Creates an instance of ProcessingBasedContainer for the WebRTC processed
   // source type. The source type allows (a) any type of echo cancellation,
   // though the system echo cancellation type depends on the availability of the
@@ -1026,9 +1050,15 @@
     }
     if (source_info.type() == SourceType::kNone ||
         source_info.type() == SourceType::kApmProcessed) {
-      processing_based_containers_.push_back(
-          ProcessingBasedContainer::CreateApmProcessedContainer(
-              source_info, is_device_capture, device_parameters_));
+      if (IsApmInAudioServiceEnabled()) {
+        processing_based_containers_.push_back(
+            ProcessingBasedContainer::CreateRemoteApmProcessedContainer(
+                source_info, is_device_capture, device_parameters_));
+      } else {
+        processing_based_containers_.push_back(
+            ProcessingBasedContainer::CreateApmProcessedContainer(
+                source_info, is_device_capture, device_parameters_));
+      }
     }
 
 #if DCHECK_IS_ON()
diff --git a/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc b/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc
index 371270c4..93328c4 100644
--- a/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc
+++ b/content/renderer/media/stream/media_stream_constraints_util_audio_unittest.cc
@@ -11,12 +11,14 @@
 #include <utility>
 
 #include "base/stl_util.h"
+#include "base/test/scoped_feature_list.h"
 #include "base/test/scoped_task_environment.h"
 #include "content/renderer/media/stream/local_media_stream_audio_source.h"
 #include "content/renderer/media/stream/mock_constraint_factory.h"
 #include "content/renderer/media/stream/processed_local_audio_source.h"
 #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h"
 #include "media/base/audio_parameters.h"
+#include "media/webrtc/webrtc_switches.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/modules/mediastream/media_stream_audio_source.h"
 #include "third_party/blink/public/platform/modules/mediastream/web_platform_media_stream_source.h"
@@ -81,52 +83,7 @@
   ~AecDumpMessageFilterForTest() override {}
 };
 
-class MediaStreamConstraintsUtilAudioTest
-    : public testing::TestWithParam<std::string> {
- public:
-  void SetUp() override {
-    ResetFactory();
-    if (IsDeviceCapture()) {
-      capabilities_.emplace_back(
-          "default_device", "fake_group1",
-          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                 media::CHANNEL_LAYOUT_STEREO,
-                                 media::AudioParameters::kAudioCDSampleRate,
-                                 1000));
-
-      media::AudioParameters system_echo_canceller_parameters(
-          media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-          media::CHANNEL_LAYOUT_STEREO,
-          media::AudioParameters::kAudioCDSampleRate, 1000);
-      system_echo_canceller_parameters.set_effects(
-          media::AudioParameters::ECHO_CANCELLER);
-      capabilities_.emplace_back("system_echo_canceller_device", "fake_group2",
-                                 system_echo_canceller_parameters);
-
-      capabilities_.emplace_back(
-          "4_channels_device", "fake_group3",
-          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                 media::CHANNEL_LAYOUT_4_0,
-                                 media::AudioParameters::kAudioCDSampleRate,
-                                 1000));
-
-      capabilities_.emplace_back(
-          "8khz_sample_rate_device", "fake_group4",
-          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
-                                 media::CHANNEL_LAYOUT_STEREO,
-                                 blink::AudioProcessing::kSampleRate8kHz,
-                                 1000));
-
-      default_device_ = &capabilities_[0];
-      system_echo_canceller_device_ = &capabilities_[1];
-      four_channels_device_ = &capabilities_[2];
-    } else {
-      // For content capture, use a single capability that admits all possible
-      // settings.
-      capabilities_.emplace_back();
-    }
-  }
-
+class MediaStreamConstraintsUtilAudioTestBase {
  protected:
   void MakeSystemEchoCancellerDeviceExperimental() {
     media::AudioParameters experimental_system_echo_canceller_parameters(
@@ -145,10 +102,11 @@
   void ResetFactory() {
     constraint_factory_.Reset();
     constraint_factory_.basic().media_stream_source.SetExact(
-        blink::WebString::FromASCII(GetParam()));
+        blink::WebString::FromASCII(GetMediaStreamSource()));
   }
 
-  std::string GetMediaStreamSource() { return GetParam(); }
+  // If not overridden, this function will return device capture by default.
+  virtual std::string GetMediaStreamSource() { return std::string(); }
   bool IsDeviceCapture() { return GetMediaStreamSource().empty(); }
 
   blink::MediaStreamType GetMediaStreamType() {
@@ -487,6 +445,87 @@
   MockPeerConnectionDependencyFactory pc_factory_;
 };
 
+class MediaStreamConstraintsUtilAudioTest
+    : public MediaStreamConstraintsUtilAudioTestBase,
+      public testing::TestWithParam<std::string> {
+ public:
+  void SetUp() override {
+    ResetFactory();
+    if (IsDeviceCapture()) {
+      capabilities_.emplace_back(
+          "default_device", "fake_group1",
+          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                 media::CHANNEL_LAYOUT_STEREO,
+                                 media::AudioParameters::kAudioCDSampleRate,
+                                 1000));
+
+      media::AudioParameters system_echo_canceller_parameters(
+          media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+          media::CHANNEL_LAYOUT_STEREO,
+          media::AudioParameters::kAudioCDSampleRate, 1000);
+      system_echo_canceller_parameters.set_effects(
+          media::AudioParameters::ECHO_CANCELLER);
+      capabilities_.emplace_back("system_echo_canceller_device", "fake_group2",
+                                 system_echo_canceller_parameters);
+
+      capabilities_.emplace_back(
+          "4_channels_device", "fake_group3",
+          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                 media::CHANNEL_LAYOUT_4_0,
+                                 media::AudioParameters::kAudioCDSampleRate,
+                                 1000));
+
+      capabilities_.emplace_back(
+          "8khz_sample_rate_device", "fake_group4",
+          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                 media::CHANNEL_LAYOUT_STEREO,
+                                 blink::AudioProcessing::kSampleRate8kHz,
+                                 1000));
+
+      default_device_ = &capabilities_[0];
+      system_echo_canceller_device_ = &capabilities_[1];
+      four_channels_device_ = &capabilities_[2];
+    } else {
+      // For content capture, use a single capability that admits all possible
+      // settings.
+      capabilities_.emplace_back();
+    }
+  }
+
+  std::string GetMediaStreamSource() override { return GetParam(); }
+};
+
+class MediaStreamConstraintsRemoteAPMTest
+    : public MediaStreamConstraintsUtilAudioTestBase,
+      public testing::TestWithParam<bool> {
+  void SetUp() override {
+    if (UseRemoteAPMFlag()) {
+      scoped_feature_list_.InitAndEnableFeature(
+          features::kWebRtcApmInAudioService);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          features::kWebRtcApmInAudioService);
+    }
+
+    // Setup the capabilities.
+    ResetFactory();
+    if (IsDeviceCapture()) {
+      capabilities_.emplace_back(
+          "default_device", "fake_group1",
+          media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                 media::CHANNEL_LAYOUT_STEREO,
+                                 media::AudioParameters::kAudioCDSampleRate,
+                                 1000));
+      default_device_ = &capabilities_[0];
+    }
+  }
+
+  bool UseRemoteAPMFlag() { return GetParam(); }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
 // The Unconstrained test checks the default selection criteria.
 TEST_P(MediaStreamConstraintsUtilAudioTest, Unconstrained) {
   auto result = SelectSettings();
@@ -2137,11 +2176,47 @@
   EXPECT_TRUE(result.HasValue());
 }
 
+TEST_P(MediaStreamConstraintsRemoteAPMTest, Channels) {
+  if (!IsDeviceCapture())
+    return;
+
+  AudioCaptureSettings result;
+  ResetFactory();
+  constraint_factory_.basic().channel_count.SetExact(1);
+  constraint_factory_.basic().echo_cancellation.SetExact(true);
+  result = SelectSettings();
+
+  if (IsApmInAudioServiceEnabled() && GetParam() == true)
+    EXPECT_FALSE(result.HasValue());
+  else
+    EXPECT_TRUE(result.HasValue());
+}
+
+TEST_P(MediaStreamConstraintsRemoteAPMTest, SampleRate) {
+  if (!IsDeviceCapture())
+    return;
+
+  AudioCaptureSettings result;
+  ResetFactory();
+  constraint_factory_.basic().sample_rate.SetExact(
+      media::AudioParameters::kAudioCDSampleRate);
+  constraint_factory_.basic().echo_cancellation.SetExact(true);
+  result = SelectSettings();
+
+  if (IsApmInAudioServiceEnabled() && GetParam() == true)
+    EXPECT_TRUE(result.HasValue());
+  else
+    EXPECT_FALSE(result.HasValue());
+}
+
 INSTANTIATE_TEST_SUITE_P(,
                          MediaStreamConstraintsUtilAudioTest,
                          testing::Values("",
                                          blink::kMediaStreamSourceTab,
                                          blink::kMediaStreamSourceSystem,
                                          blink::kMediaStreamSourceDesktop));
+INSTANTIATE_TEST_SUITE_P(,
+                         MediaStreamConstraintsRemoteAPMTest,
+                         testing::Bool());
 
 }  // namespace content
diff --git a/content/renderer/media/stream/processed_local_audio_source.cc b/content/renderer/media/stream/processed_local_audio_source.cc
index c663e36a..8aa5d9c 100644
--- a/content/renderer/media/stream/processed_local_audio_source.cc
+++ b/content/renderer/media/stream/processed_local_audio_source.cc
@@ -35,14 +35,6 @@
 void* const kProcessedLocalAudioSourceIdentifier =
     const_cast<void**>(&kProcessedLocalAudioSourceIdentifier);
 
-bool ApmInAudioServiceEnabled() {
-#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
-  return base::FeatureList::IsEnabled(features::kWebRtcApmInAudioService);
-#else
-  return false;
-#endif
-}
-
 void LogAudioProcesingProperties(
     const blink::AudioProcessingProperties& properties) {
   auto aec_to_string =
@@ -87,6 +79,14 @@
 }
 }  // namespace
 
+bool IsApmInAudioServiceEnabled() {
+#if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX)
+  return base::FeatureList::IsEnabled(features::kWebRtcApmInAudioService);
+#else
+  return false;
+#endif
+}
+
 ProcessedLocalAudioSource::ProcessedLocalAudioSource(
     int consumer_render_frame_id,
     const blink::MediaStreamDevice& device,
@@ -260,7 +260,7 @@
   DCHECK(params.IsValid());
   media::AudioSourceParameters source_params(device().session_id);
   const bool use_remote_apm =
-      ApmInAudioServiceEnabled() &&
+      IsApmInAudioServiceEnabled() &&
       MediaStreamAudioProcessor::WouldModifyAudio(audio_processing_properties_);
   if (use_remote_apm) {
     audio_processor_proxy_ =
diff --git a/content/renderer/media/stream/processed_local_audio_source.h b/content/renderer/media/stream/processed_local_audio_source.h
index bb5eff1c5..e7c05c5 100644
--- a/content/renderer/media/stream/processed_local_audio_source.h
+++ b/content/renderer/media/stream/processed_local_audio_source.h
@@ -25,6 +25,8 @@
 
 namespace content {
 
+CONTENT_EXPORT bool IsApmInAudioServiceEnabled();
+
 class PeerConnectionDependencyFactory;
 
 // Represents a local source of audio data that is routed through the WebRTC
diff --git a/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.cc b/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.cc
index a5d04bd..eac95764 100644
--- a/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.cc
+++ b/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.cc
@@ -103,7 +103,7 @@
 
 void FakeRTCRtpSender::GetStats(
     std::unique_ptr<blink::WebRTCStatsReportCallback>,
-    blink::RTCStatsFilter) {
+    const std::vector<webrtc::NonStandardGroupId>&) {
   NOTIMPLEMENTED();
 }
 
@@ -165,7 +165,7 @@
 
 void FakeRTCRtpReceiver::GetStats(
     std::unique_ptr<blink::WebRTCStatsReportCallback>,
-    blink::RTCStatsFilter) {
+    const std::vector<webrtc::NonStandardGroupId>&) {
   NOTIMPLEMENTED();
 }
 
diff --git a/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.h b/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.h
index cda182e..3bd5ef07 100644
--- a/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.h
+++ b/content/renderer/media/webrtc/fake_rtc_rtp_transceiver.h
@@ -49,7 +49,7 @@
                      webrtc::DegradationPreference,
                      blink::WebRTCVoidRequest) override;
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                blink::RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&) override;
 
  private:
   base::Optional<std::string> track_id_;
@@ -75,7 +75,7 @@
   blink::WebVector<std::unique_ptr<blink::WebRTCRtpSource>> GetSources()
       override;
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                blink::RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&) override;
   std::unique_ptr<webrtc::RtpParameters> GetParameters() const override;
 
  private:
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
index 454098b..393926e 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.cc
@@ -16,7 +16,6 @@
 #include "base/location.h"
 #include "base/logging.h"
 #include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/metrics/field_trial.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -47,7 +46,6 @@
 #include "content/renderer/render_view_impl.h"
 #include "crypto/openssl_util.h"
 #include "jingle/glue/thread_wrapper.h"
-#include "media/base/bind_to_current_loop.h"
 #include "media/base/media_permission.h"
 #include "media/media_buildflags.h"
 #include "media/video/gpu_video_accelerator_factories.h"
@@ -124,8 +122,7 @@
       signaling_thread_(nullptr),
       worker_thread_(nullptr),
       chrome_signaling_thread_("Chrome_libJingle_Signaling"),
-      chrome_worker_thread_("Chrome_libJingle_WorkerThread"),
-      weak_factory_(this) {
+      chrome_worker_thread_("Chrome_libJingle_WorkerThread") {
   TryScheduleStunProbeTrial();
 }
 
@@ -202,11 +199,20 @@
   base::WaitableEvent create_network_manager_event(
       base::WaitableEvent::ResetPolicy::MANUAL,
       base::WaitableEvent::InitialState::NOT_SIGNALED);
+  std::unique_ptr<MdnsResponderAdapter> mdns_responder;
+#if BUILDFLAG(ENABLE_MDNS)
+  if (base::FeatureList::IsEnabled(features::kWebRtcHideLocalIpsWithMdns)) {
+    // Note that MdnsResponderAdapter is created on the main thread to have
+    // access to the connector to the service manager.
+    mdns_responder = std::make_unique<MdnsResponderAdapter>();
+  }
+#endif  // BUILDFLAG(ENABLE_MDNS)
   chrome_worker_thread_.task_runner()->PostTask(
       FROM_HERE,
       base::BindOnce(&PeerConnectionDependencyFactory::
                          CreateIpcNetworkManagerOnWorkerThread,
-                     base::Unretained(this), &create_network_manager_event));
+                     base::Unretained(this), &create_network_manager_event,
+                     std::move(mdns_responder)));
 
   start_worker_event.Wait();
   create_network_manager_event.Wait();
@@ -448,12 +454,8 @@
 
   std::unique_ptr<rtc::NetworkManager> network_manager;
   if (port_config.enable_multiple_routes) {
-    auto callback = media::BindToCurrentLoop(base::BindRepeating(
-        &PeerConnectionDependencyFactory::OnEnumeratePermissionChanged,
-        weak_factory_.GetWeakPtr()));
     network_manager = std::make_unique<FilteringNetworkManager>(
-        network_manager_.get(), requesting_origin, media_permission,
-        std::move(callback));
+        network_manager_.get(), requesting_origin, media_permission);
   } else {
     network_manager =
         std::make_unique<EmptyNetworkManager>(network_manager_.get());
@@ -558,10 +560,11 @@
 }
 
 void PeerConnectionDependencyFactory::CreateIpcNetworkManagerOnWorkerThread(
-    base::WaitableEvent* event) {
+    base::WaitableEvent* event,
+    std::unique_ptr<MdnsResponderAdapter> mdns_responder) {
   DCHECK(chrome_worker_thread_.task_runner()->BelongsToCurrentThread());
-  network_manager_ =
-      std::make_unique<IpcNetworkManager>(p2p_socket_dispatcher_.get());
+  network_manager_ = std::make_unique<IpcNetworkManager>(
+      p2p_socket_dispatcher_.get(), std::move(mdns_responder));
   event->Signal();
 }
 
@@ -652,24 +655,4 @@
   return nullptr;
 }
 
-void PeerConnectionDependencyFactory::OnEnumeratePermissionChanged(
-    rtc::NetworkManager::EnumerationPermission new_state) {
-#if BUILDFLAG(ENABLE_MDNS)
-  std::unique_ptr<MdnsResponderAdapter> mdns_responder;
-  if (new_state == rtc::NetworkManager::ENUMERATION_BLOCKED &&
-      base::FeatureList::IsEnabled(features::kWebRtcHideLocalIpsWithMdns)) {
-    // Note that MdnsResponderAdapter is created on the main thread to have
-    // access to the connector to the service manager.
-    mdns_responder = std::make_unique<MdnsResponderAdapter>();
-  }
-  // base::Unretained is safe below because |network_manager_| will be destroyed
-  // only after |chrome_work_thread_| stops, which flushes all tasks. See
-  // PeerConnectionDependencyFactory::CleanupPeerConnectionFactory.
-  chrome_worker_thread_.task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&IpcNetworkManager::SetMdnsResponder,
-                                base::Unretained(network_manager_.get()),
-                                base::Passed(&mdns_responder)));
-#endif  // BUILDFLAG(ENABLE_MDNS)
-}
-
 }  // namespace content
diff --git a/content/renderer/media/webrtc/peer_connection_dependency_factory.h b/content/renderer/media/webrtc/peer_connection_dependency_factory.h
index 5182cab..137b36ac 100644
--- a/content/renderer/media/webrtc/peer_connection_dependency_factory.h
+++ b/content/renderer/media/webrtc/peer_connection_dependency_factory.h
@@ -9,7 +9,6 @@
 
 #include "base/files/file.h"
 #include "base/macros.h"
-#include "base/memory/weak_ptr.h"
 #include "base/message_loop/message_loop_current.h"
 #include "base/sequence_checker.h"
 #include "base/single_thread_task_runner.h"
@@ -43,6 +42,7 @@
 
 class IpcNetworkManager;
 class IpcPacketSocketFactory;
+class MdnsResponderAdapter;
 class P2PPortAllocator;
 class WebRtcAudioDeviceImpl;
 
@@ -150,13 +150,12 @@
   void InitializeWorkerThread(rtc::Thread** thread,
                               base::WaitableEvent* event);
 
-  void CreateIpcNetworkManagerOnWorkerThread(base::WaitableEvent* event);
+  void CreateIpcNetworkManagerOnWorkerThread(
+      base::WaitableEvent* event,
+      std::unique_ptr<MdnsResponderAdapter> mdns_responder);
   void DeleteIpcNetworkManager();
   void CleanupPeerConnectionFactory();
 
-  void OnEnumeratePermissionChanged(
-      rtc::NetworkManager::EnumerationPermission new_state);
-
   // network_manager_ must be deleted on the worker thread. The network manager
   // uses |p2p_socket_dispatcher_|.
   std::unique_ptr<IpcNetworkManager> network_manager_;
@@ -178,9 +177,6 @@
 
   SEQUENCE_CHECKER(sequence_checker_);
 
-  // The weak pointer MUST only be dereferenced on the main thread.
-  base::WeakPtrFactory<PeerConnectionDependencyFactory> weak_factory_;
-
   DISALLOW_COPY_AND_ASSIGN(PeerConnectionDependencyFactory);
 };
 
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
index 9ae8c3cc..0e057f3 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.cc
@@ -506,11 +506,11 @@
     const scoped_refptr<base::SingleThreadTaskRunner>& main_thread,
     scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection,
     std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-    blink::RTCStatsFilter filter) {
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
   TRACE_EVENT0("webrtc", "GetRTCStatsOnSignalingThread");
 
   native_peer_connection->GetStats(RTCStatsCollectorCallbackImpl::Create(
-      main_thread, std::move(callback), filter));
+      main_thread, std::move(callback), exposed_group_ids));
 }
 
 void ConvertOfferOptionsToWebrtcOfferOptions(
@@ -1553,12 +1553,12 @@
 
 void RTCPeerConnectionHandler::GetStats(
     std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-    blink::RTCStatsFilter filter) {
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
   DCHECK(task_runner_->RunsTasksInCurrentSequence());
   signaling_thread()->PostTask(
-      FROM_HERE,
-      base::BindOnce(&GetRTCStatsOnSignalingThread, task_runner_,
-                     native_peer_connection_, std::move(callback), filter));
+      FROM_HERE, base::BindOnce(&GetRTCStatsOnSignalingThread, task_runner_,
+                                native_peer_connection_, std::move(callback),
+                                exposed_group_ids));
 }
 
 webrtc::RTCErrorOr<std::unique_ptr<blink::WebRTCRtpTransceiver>>
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler.h b/content/renderer/media/webrtc/rtc_peer_connection_handler.h
index 7a0261f..640221f 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler.h
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler.h
@@ -30,6 +30,7 @@
 #include "third_party/blink/public/platform/web_rtc_stats.h"
 #include "third_party/blink/public/platform/web_rtc_stats_request.h"
 #include "third_party/blink/public/platform/web_rtc_stats_response.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 class WebLocalFrame;
@@ -152,7 +153,8 @@
 
   void GetStats(const blink::WebRTCStatsRequest& request) override;
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-                blink::RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&
+                    exposed_group_ids) override;
   webrtc::RTCErrorOr<std::unique_ptr<blink::WebRTCRtpTransceiver>>
   AddTransceiverWithTrack(const blink::WebMediaStreamTrack& web_track,
                           const webrtc::RtpTransceiverInit& init) override;
diff --git a/content/renderer/media/webrtc/rtc_peer_connection_handler_unittest.cc b/content/renderer/media/webrtc/rtc_peer_connection_handler_unittest.cc
index a2db1f5..0330405 100644
--- a/content/renderer/media/webrtc/rtc_peer_connection_handler_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_peer_connection_handler_unittest.cc
@@ -945,7 +945,7 @@
   std::unique_ptr<blink::WebRTCStatsReport> result;
   pc_handler_->GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>(
                             new MockRTCStatsReportCallback(&result)),
-                        blink::RTCStatsFilter::kIncludeNonStandardMembers);
+                        {});
   RunMessageLoopsUntilIdle();
   EXPECT_TRUE(result);
 
diff --git a/content/renderer/media/webrtc/rtc_rtp_receiver.cc b/content/renderer/media/webrtc/rtc_rtp_receiver.cc
index 8edb691..2f28c54 100644
--- a/content/renderer/media/webrtc/rtc_rtp_receiver.cc
+++ b/content/renderer/media/webrtc/rtc_rtp_receiver.cc
@@ -167,12 +167,13 @@
     return sources;
   }
 
-  void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-                blink::RTCStatsFilter filter) {
+  void GetStats(
+      std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
     signaling_task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(&RTCRtpReceiverInternal::GetStatsOnSignalingThread, this,
-                       std::move(callback), filter));
+                       std::move(callback), exposed_group_ids));
   }
 
   std::unique_ptr<webrtc::RtpParameters> GetParameters() {
@@ -189,11 +190,11 @@
 
   void GetStatsOnSignalingThread(
       std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-      blink::RTCStatsFilter filter) {
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
     native_peer_connection_->GetStats(
         webrtc_receiver_.get(),
-        RTCStatsCollectorCallbackImpl::Create(main_task_runner_,
-                                              std::move(callback), filter));
+        RTCStatsCollectorCallbackImpl::Create(
+            main_task_runner_, std::move(callback), exposed_group_ids));
   }
 
   const scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection_;
@@ -291,8 +292,8 @@
 
 void RTCRtpReceiver::GetStats(
     std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-    blink::RTCStatsFilter filter) {
-  internal_->GetStats(std::move(callback), filter);
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
+  internal_->GetStats(std::move(callback), exposed_group_ids);
 }
 
 std::unique_ptr<webrtc::RtpParameters> RTCRtpReceiver::GetParameters() const {
diff --git a/content/renderer/media/webrtc/rtc_rtp_receiver.h b/content/renderer/media/webrtc/rtc_rtp_receiver.h
index 8a8119db..1577d0c 100644
--- a/content/renderer/media/webrtc/rtc_rtp_receiver.h
+++ b/content/renderer/media/webrtc/rtc_rtp_receiver.h
@@ -5,6 +5,8 @@
 #ifndef CONTENT_RENDERER_MEDIA_WEBRTC_RTC_RTP_RECEIVER_H_
 #define CONTENT_RENDERER_MEDIA_WEBRTC_RTC_RTP_RECEIVER_H_
 
+#include <vector>
+
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/single_thread_task_runner.h"
@@ -18,6 +20,7 @@
 #include "third_party/webrtc/api/media_stream_interface.h"
 #include "third_party/webrtc/api/peer_connection_interface.h"
 #include "third_party/webrtc/api/rtp_receiver_interface.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace content {
 
@@ -127,7 +130,7 @@
   blink::WebVector<std::unique_ptr<blink::WebRTCRtpSource>> GetSources()
       override;
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                blink::RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&) override;
   std::unique_ptr<webrtc::RtpParameters> GetParameters() const override;
 
  private:
diff --git a/content/renderer/media/webrtc/rtc_rtp_receiver_unittest.cc b/content/renderer/media/webrtc/rtc_rtp_receiver_unittest.cc
index 4a5d05b..c75292c 100644
--- a/content/renderer/media/webrtc/rtc_rtp_receiver_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_rtp_receiver_unittest.cc
@@ -83,8 +83,7 @@
   scoped_refptr<WebRTCStatsReportObtainer> GetStats() {
     scoped_refptr<WebRTCStatsReportObtainer> obtainer =
         new WebRTCStatsReportObtainer();
-    receiver_->GetStats(obtainer->GetStatsCallbackWrapper(),
-                        blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+    receiver_->GetStats(obtainer->GetStatsCallbackWrapper(), {});
     return obtainer;
   }
 
diff --git a/content/renderer/media/webrtc/rtc_rtp_sender.cc b/content/renderer/media/webrtc/rtc_rtp_sender.cc
index 0bea4bcf..c95125d 100644
--- a/content/renderer/media/webrtc/rtc_rtp_sender.cc
+++ b/content/renderer/media/webrtc/rtc_rtp_sender.cc
@@ -255,13 +255,14 @@
             this, std::move(new_parameters), std::move(callback)));
   }
 
-  void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-                blink::RTCStatsFilter filter) {
+  void GetStats(
+      std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
     signaling_task_runner_->PostTask(
         FROM_HERE,
         base::BindOnce(
             &RTCRtpSender::RTCRtpSenderInternal::GetStatsOnSignalingThread,
-            this, std::move(callback), filter));
+            this, std::move(callback), exposed_group_ids));
   }
 
   bool RemoveFromPeerConnection(webrtc::PeerConnectionInterface* pc) {
@@ -311,11 +312,11 @@
 
   void GetStatsOnSignalingThread(
       std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-      blink::RTCStatsFilter filter) {
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
     native_peer_connection_->GetStats(
         webrtc_sender_.get(),
-        RTCStatsCollectorCallbackImpl::Create(main_task_runner_,
-                                              std::move(callback), filter));
+        RTCStatsCollectorCallbackImpl::Create(
+            main_task_runner_, std::move(callback), exposed_group_ids));
   }
 
   void SetParametersOnSignalingThread(
@@ -455,8 +456,8 @@
 
 void RTCRtpSender::GetStats(
     std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-    blink::RTCStatsFilter filter) {
-  internal_->GetStats(std::move(callback), filter);
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
+  internal_->GetStats(std::move(callback), exposed_group_ids);
 }
 
 void RTCRtpSender::ReplaceTrack(blink::WebMediaStreamTrack with_track,
diff --git a/content/renderer/media/webrtc/rtc_rtp_sender.h b/content/renderer/media/webrtc/rtc_rtp_sender.h
index c0e6bdd..efb613e 100644
--- a/content/renderer/media/webrtc/rtc_rtp_sender.h
+++ b/content/renderer/media/webrtc/rtc_rtp_sender.h
@@ -140,7 +140,7 @@
                      webrtc::DegradationPreference,
                      blink::WebRTCVoidRequest) override;
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                blink::RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&) override;
 
   // The ReplaceTrack() that takes a blink::WebRTCVoidRequest is implemented on
   // top of this, which returns the result in a callback instead. Allows doing
diff --git a/content/renderer/media/webrtc/rtc_rtp_sender_unittest.cc b/content/renderer/media/webrtc/rtc_rtp_sender_unittest.cc
index a9dc418..9e487756 100644
--- a/content/renderer/media/webrtc/rtc_rtp_sender_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_rtp_sender_unittest.cc
@@ -121,8 +121,7 @@
   scoped_refptr<WebRTCStatsReportObtainer> CallGetStats() {
     scoped_refptr<WebRTCStatsReportObtainer> obtainer =
         new WebRTCStatsReportObtainer();
-    sender_->GetStats(obtainer->GetStatsCallbackWrapper(),
-                      blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+    sender_->GetStats(obtainer->GetStatsCallbackWrapper(), {});
     return obtainer;
   }
 
diff --git a/content/renderer/media/webrtc/rtc_stats.cc b/content/renderer/media/webrtc/rtc_stats.cc
index 66c745d0..6f752b7d 100644
--- a/content/renderer/media/webrtc/rtc_stats.cc
+++ b/content/renderer/media/webrtc/rtc_stats.cc
@@ -12,6 +12,7 @@
 #include "base/logging.h"
 #include "base/stl_util.h"
 #include "base/time/time.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 #include "third_party/webrtc/api/stats/rtcstats_objects.h"
 
 namespace content {
@@ -59,17 +60,31 @@
   return GetStatsWhitelist()->IsWhitelisted(stats);
 }
 
-// Filters out any unstandardized members; stats should only be surfaced to JS
-// if they're standardized.
-std::vector<const webrtc::RTCStatsMemberInterface*> StandardizedMembers(
-    std::vector<const webrtc::RTCStatsMemberInterface*> stats_members) {
+// Filters stats that should be surfaced to JS. Stats are surfaced if they're
+// standardized or if there is an active origin trial that enables a stat by
+// including one of its group IDs in |exposed_group_ids|.
+std::vector<const webrtc::RTCStatsMemberInterface*> FilterMembers(
+    std::vector<const webrtc::RTCStatsMemberInterface*> stats_members,
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
   // Note that using "is_standarized" avoids having to maintain a whitelist of
   // every single standardized member, as we do at the "stats object" level
   // with "RTCStatsWhitelist".
-  base::EraseIf(stats_members,
-                [](const webrtc::RTCStatsMemberInterface* member) {
-                  return !member->is_standardized();
-                });
+  base::EraseIf(
+      stats_members,
+      [&exposed_group_ids](const webrtc::RTCStatsMemberInterface* member) {
+        if (member->is_standardized()) {
+          return false;
+        }
+
+        const std::vector<webrtc::NonStandardGroupId>& ids =
+            member->group_ids();
+        for (const webrtc::NonStandardGroupId& id : exposed_group_ids) {
+          if (std::find(ids.begin(), ids.end(), id) != ids.end()) {
+            return false;
+          }
+        }
+        return true;
+      });
   return stats_members;
 }
 
@@ -77,11 +92,11 @@
 
 RTCStatsReport::RTCStatsReport(
     const scoped_refptr<const webrtc::RTCStatsReport>& stats_report,
-    blink::RTCStatsFilter filter)
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids)
     : stats_report_(stats_report),
       it_(stats_report_->begin()),
       end_(stats_report_->end()),
-      filter_(filter) {
+      exposed_group_ids_(exposed_group_ids) {
   DCHECK(stats_report_);
 }
 
@@ -90,7 +105,7 @@
 
 std::unique_ptr<blink::WebRTCStatsReport> RTCStatsReport::CopyHandle() const {
   return std::unique_ptr<blink::WebRTCStatsReport>(
-      new RTCStatsReport(stats_report_, filter_));
+      new RTCStatsReport(stats_report_, exposed_group_ids_));
 }
 
 std::unique_ptr<blink::WebRTCStats> RTCStatsReport::GetStats(
@@ -99,7 +114,7 @@
   if (!stats || !IsWhitelistedStats(*stats))
     return std::unique_ptr<blink::WebRTCStats>();
   return std::unique_ptr<blink::WebRTCStats>(
-      new RTCStats(stats_report_, stats, filter_));
+      new RTCStats(stats_report_, stats, exposed_group_ids_));
 }
 
 std::unique_ptr<blink::WebRTCStats> RTCStatsReport::Next() {
@@ -108,7 +123,7 @@
     ++it_;
     if (IsWhitelistedStats(next)) {
       return std::unique_ptr<blink::WebRTCStats>(
-          new RTCStats(stats_report_, &next, filter_));
+          new RTCStats(stats_report_, &next, exposed_group_ids_));
     }
   }
   return std::unique_ptr<blink::WebRTCStats>();
@@ -124,12 +139,10 @@
 RTCStats::RTCStats(
     const scoped_refptr<const webrtc::RTCStatsReport>& stats_owner,
     const webrtc::RTCStats* stats,
-    blink::RTCStatsFilter filter)
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids)
     : stats_owner_(stats_owner),
       stats_(stats),
-      stats_members_(filter == blink::RTCStatsFilter::kIncludeNonStandardMembers
-                         ? stats->Members()
-                         : StandardizedMembers(stats->Members())) {
+      stats_members_(FilterMembers(stats->Members(), exposed_group_ids)) {
   DCHECK(stats_owner_);
   DCHECK(stats_);
   DCHECK(stats_owner_->Get(stats_->id()));
@@ -310,19 +323,19 @@
 RTCStatsCollectorCallbackImpl::Create(
     scoped_refptr<base::SingleThreadTaskRunner> main_thread,
     std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-    blink::RTCStatsFilter filter) {
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids) {
   return rtc::scoped_refptr<RTCStatsCollectorCallbackImpl>(
       new rtc::RefCountedObject<RTCStatsCollectorCallbackImpl>(
-          std::move(main_thread), callback.release(), filter));
+          std::move(main_thread), callback.release(), exposed_group_ids));
 }
 
 RTCStatsCollectorCallbackImpl::RTCStatsCollectorCallbackImpl(
     scoped_refptr<base::SingleThreadTaskRunner> main_thread,
     blink::WebRTCStatsReportCallback* callback,
-    blink::RTCStatsFilter filter)
+    const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids)
     : main_thread_(std::move(main_thread)),
       callback_(callback),
-      filter_(filter) {}
+      exposed_group_ids_(exposed_group_ids) {}
 
 RTCStatsCollectorCallbackImpl::~RTCStatsCollectorCallbackImpl() {
   DCHECK(!callback_);
@@ -343,7 +356,7 @@
   DCHECK(report);
   DCHECK(callback_);
   callback_->OnStatsDelivered(std::make_unique<RTCStatsReport>(
-      base::WrapRefCounted(report.get()), filter_));
+      base::WrapRefCounted(report.get()), exposed_group_ids_));
   // Make sure the callback is destroyed in the main thread as well.
   callback_.reset();
 }
diff --git a/content/renderer/media/webrtc/rtc_stats.h b/content/renderer/media/webrtc/rtc_stats.h
index 3f6e49e..0b223265 100644
--- a/content/renderer/media/webrtc/rtc_stats.h
+++ b/content/renderer/media/webrtc/rtc_stats.h
@@ -23,7 +23,7 @@
  public:
   RTCStatsReport(
       const scoped_refptr<const webrtc::RTCStatsReport>& stats_report,
-      blink::RTCStatsFilter filter);
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids);
   ~RTCStatsReport() override;
   std::unique_ptr<blink::WebRTCStatsReport> CopyHandle() const override;
 
@@ -36,14 +36,14 @@
   const scoped_refptr<const webrtc::RTCStatsReport> stats_report_;
   webrtc::RTCStatsReport::ConstIterator it_;
   const webrtc::RTCStatsReport::ConstIterator end_;
-  blink::RTCStatsFilter filter_;
+  std::vector<webrtc::NonStandardGroupId> exposed_group_ids_;
 };
 
 class CONTENT_EXPORT RTCStats : public blink::WebRTCStats {
  public:
   RTCStats(const scoped_refptr<const webrtc::RTCStatsReport>& stats_owner,
            const webrtc::RTCStats* stats,
-           blink::RTCStatsFilter filter);
+           const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids);
   ~RTCStats() override;
 
   blink::WebString Id() const override;
@@ -103,7 +103,7 @@
   static rtc::scoped_refptr<RTCStatsCollectorCallbackImpl> Create(
       scoped_refptr<base::SingleThreadTaskRunner> main_thread,
       std::unique_ptr<blink::WebRTCStatsReportCallback> callback,
-      blink::RTCStatsFilter);
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids);
 
   void OnStatsDelivered(
       const rtc::scoped_refptr<const webrtc::RTCStatsReport>& report) override;
@@ -112,7 +112,7 @@
   RTCStatsCollectorCallbackImpl(
       scoped_refptr<base::SingleThreadTaskRunner> main_thread,
       blink::WebRTCStatsReportCallback* callback,
-      blink::RTCStatsFilter);
+      const std::vector<webrtc::NonStandardGroupId>& exposed_group_ids);
   ~RTCStatsCollectorCallbackImpl() override;
 
   void OnStatsDeliveredOnMainThread(
@@ -120,7 +120,7 @@
 
   const scoped_refptr<base::SingleThreadTaskRunner> main_thread_;
   std::unique_ptr<blink::WebRTCStatsReportCallback> callback_;
-  blink::RTCStatsFilter filter_;
+  std::vector<webrtc::NonStandardGroupId> exposed_group_ids_;
 };
 
 CONTENT_EXPORT void WhitelistStatsForTesting(const char* type);
diff --git a/content/renderer/media/webrtc/rtc_stats_unittest.cc b/content/renderer/media/webrtc/rtc_stats_unittest.cc
index e33ef87..29a1725f 100644
--- a/content/renderer/media/webrtc/rtc_stats_unittest.cc
+++ b/content/renderer/media/webrtc/rtc_stats_unittest.cc
@@ -25,8 +25,7 @@
   webrtc_report->AddStats(std::unique_ptr<webrtc::RTCPeerConnectionStats>(
       new webrtc::RTCPeerConnectionStats(whitelisted_id, 42)));
 
-  RTCStatsReport report(webrtc_report.get(),
-                        blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+  RTCStatsReport report(webrtc_report.get(), {});
   EXPECT_FALSE(report.GetStats(blink::WebString::FromUTF8(not_whitelisted_id)));
   EXPECT_TRUE(report.GetStats(blink::WebString::FromUTF8(whitelisted_id)));
 }
@@ -42,8 +41,7 @@
   webrtc_report->AddStats(std::unique_ptr<webrtc::RTCPeerConnectionStats>(
       new webrtc::RTCPeerConnectionStats(whitelisted_id, 42)));
 
-  RTCStatsReport report(webrtc_report.get(),
-                        blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+  RTCStatsReport report(webrtc_report.get(), {});
   std::unique_ptr<blink::WebRTCStats> stats = report.Next();
   EXPECT_TRUE(stats);
   EXPECT_EQ(stats->Id(), whitelisted_id);
@@ -73,7 +71,8 @@
 TestStats::TestStats(const std::string& id, int64_t timestamp_us)
     : RTCStats(id, timestamp_us),
       standardized("standardized"),
-      non_standardized("non_standardized") {}
+      non_standardized("non_standardized",
+                       {webrtc::NonStandardGroupId::kGroupIdForTesting}) {}
 }  // namespace
 
 // Similar to how only whitelisted stats objects should be surfaced, only
@@ -86,8 +85,7 @@
 
   // TestStats has two members, but the non-standard member should be filtered
   // out.
-  RTCStatsReport report(webrtc_report.get(),
-                        blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+  RTCStatsReport report(webrtc_report.get(), {});
   std::unique_ptr<blink::WebRTCStats> stats = report.Next();
   ASSERT_NE(nullptr, stats);
   ASSERT_EQ(1u, stats->MembersCount());
@@ -100,9 +98,9 @@
   WhitelistStatsForTesting(TestStats::kType);
   webrtc_report->AddStats(std::make_unique<TestStats>("id", 0));
 
-  // Include both standard and non-standard members.
+  // Include both standard and non-standard member.
   RTCStatsReport report(webrtc_report.get(),
-                        blink::RTCStatsFilter::kIncludeNonStandardMembers);
+                        {webrtc::NonStandardGroupId::kGroupIdForTesting});
   std::unique_ptr<blink::WebRTCStats> stats = report.GetStats("id");
   ASSERT_NE(nullptr, stats);
   ASSERT_EQ(2u, stats->MembersCount());
@@ -117,8 +115,7 @@
   webrtc_report->AddStats(std::make_unique<TestStats>("id", 0));
 
   // Check that filtering options are preserved during copy.
-  RTCStatsReport standard_members_report(
-      webrtc_report.get(), blink::RTCStatsFilter::kIncludeOnlyStandardMembers);
+  RTCStatsReport standard_members_report(webrtc_report.get(), {});
   std::unique_ptr<blink::WebRTCStatsReport> standard_members_copy =
       standard_members_report.CopyHandle();
 
@@ -126,7 +123,7 @@
   ASSERT_EQ(1u, standard_members_copy->GetStats("id")->MembersCount());
 
   RTCStatsReport all_members_report(
-      webrtc_report.get(), blink::RTCStatsFilter::kIncludeNonStandardMembers);
+      webrtc_report.get(), {webrtc::NonStandardGroupId::kGroupIdForTesting});
   std::unique_ptr<blink::WebRTCStatsReport> all_members_copy =
       all_members_report.CopyHandle();
   ASSERT_EQ(2u, all_members_report.GetStats("id")->MembersCount());
diff --git a/content/renderer/p2p/filtering_network_manager.cc b/content/renderer/p2p/filtering_network_manager.cc
index d09315d..73b9985 100644
--- a/content/renderer/p2p/filtering_network_manager.cc
+++ b/content/renderer/p2p/filtering_network_manager.cc
@@ -17,20 +17,18 @@
 FilteringNetworkManager::FilteringNetworkManager(
     rtc::NetworkManager* network_manager,
     const GURL& requesting_origin,
-    media::MediaPermission* media_permission,
-    OnEnumerationPermissionCallback callback)
+    media::MediaPermission* media_permission)
     : network_manager_(network_manager),
       media_permission_(media_permission),
       requesting_origin_(requesting_origin),
-      on_enumeration_permission_cb_(std::move(callback)),
       weak_ptr_factory_(this) {
   thread_checker_.DetachFromThread();
-  SetEnumerationPermissionAndNotify(ENUMERATION_BLOCKED);
+  set_enumeration_permission(ENUMERATION_BLOCKED);
 
   // If the feature is not enabled, just return ALLOWED as it's requested.
   if (!media_permission_) {
     started_permission_check_ = true;
-    SetEnumerationPermissionAndNotify(ENUMERATION_ALLOWED);
+    set_enumeration_permission(ENUMERATION_ALLOWED);
     VLOG(3) << "media_permission is not passed, granting permission";
     return;
   }
@@ -68,6 +66,13 @@
   pending_network_update_ = true;
   ++start_count_;
   network_manager_->StartUpdating();
+  // If we have not sent the first update, which implies we have not received
+  // the first network update from the base network manager, we wait until the
+  // base network manager signals a network change for us to populate the
+  // network information in |OnNetworksChanged| and fire the event there.
+  if (sent_first_update_) {
+    FireEventIfStarted();
+  }
 }
 
 void FilteringNetworkManager::StopUpdating() {
@@ -82,19 +87,18 @@
   networks->clear();
 
   if (enumeration_permission() == ENUMERATION_ALLOWED)
-    network_manager_->GetNetworks(networks);
+    NetworkManagerBase::GetNetworks(networks);
 
   VLOG(3) << "GetNetworks() returns " << networks->size() << " networks.";
 }
 
-bool FilteringNetworkManager::GetDefaultLocalAddress(
-    int family,
-    rtc::IPAddress* ipaddress) const {
-  return network_manager_->GetDefaultLocalAddress(family, ipaddress);
-}
-
 webrtc::MdnsResponderInterface* FilteringNetworkManager::GetMdnsResponder()
     const {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (enumeration_permission() == ENUMERATION_ALLOWED)
+    return nullptr;
+
   return network_manager_->GetMdnsResponder();
 }
 
@@ -125,7 +129,7 @@
   --pending_permission_checks_;
 
   if (granted)
-    SetEnumerationPermissionAndNotify(ENUMERATION_ALLOWED);
+    set_enumeration_permission(ENUMERATION_ALLOWED);
 
   // If the IP permission status changed *and* we have an up-to-date network
   // list, fire a network change event.
@@ -133,23 +137,35 @@
     FireEventIfStarted();
 }
 
-void FilteringNetworkManager::SetEnumerationPermissionAndNotify(
-    EnumerationPermission state) {
-  EnumerationPermission old_state = enumeration_permission();
-  if (state != old_state) {
-    set_enumeration_permission(state);
-    if (on_enumeration_permission_cb_)
-      on_enumeration_permission_cb_.Run(state);
-  }
-}
-
 void FilteringNetworkManager::OnNetworksChanged() {
   DCHECK(thread_checker_.CalledOnValidThread());
   pending_network_update_ = false;
+
+  // Update the default local addresses.
+  rtc::IPAddress ipv4_default;
+  rtc::IPAddress ipv6_default;
+  network_manager_->GetDefaultLocalAddress(AF_INET, &ipv4_default);
+  network_manager_->GetDefaultLocalAddress(AF_INET6, &ipv6_default);
+  set_default_local_addresses(ipv4_default, ipv6_default);
+
+  // Copy and merge the networks. Fire a signal if the permission status is
+  // known.
+  NetworkList networks;
+  network_manager_->GetNetworks(&networks);
+  NetworkList copied_networks;
+  copied_networks.reserve(networks.size());
+  for (rtc::Network* network : networks) {
+    auto copied_network = std::make_unique<rtc::Network>(*network);
+    copied_network->set_default_local_address_provider(this);
+    copied_network->set_mdns_responder_provider(this);
+    copied_networks.push_back(copied_network.release());
+  }
+  bool changed;
+  MergeNetworkList(copied_networks, &changed);
   // We wait until our permission status is known before firing a network
   // change signal, so that the listener(s) don't miss out on receiving a
   // full network list.
-  if (GetIPPermissionStatus() != PERMISSION_UNKNOWN)
+  if (changed && GetIPPermissionStatus() != PERMISSION_UNKNOWN)
     FireEventIfStarted();
 }
 
diff --git a/content/renderer/p2p/filtering_network_manager.h b/content/renderer/p2p/filtering_network_manager.h
index 47a9f6a..95fe433 100644
--- a/content/renderer/p2p/filtering_network_manager.h
+++ b/content/renderer/p2p/filtering_network_manager.h
@@ -5,10 +5,8 @@
 #ifndef CONTENT_RENDERER_P2P_FILTERING_NETWORK_MANAGER_H_
 #define CONTENT_RENDERER_P2P_FILTERING_NETWORK_MANAGER_H_
 
-#include "base/callback.h"
 #include "base/macros.h"
 #include "base/memory/weak_ptr.h"
-#include "base/single_thread_task_runner.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "content/common/content_export.h"
@@ -39,17 +37,12 @@
 class FilteringNetworkManager : public rtc::NetworkManagerBase,
                                 public sigslot::has_slots<> {
  public:
-  // A callback that will be executed when |enumeration_permission_| changes.
-  using OnEnumerationPermissionCallback =
-      base::RepeatingCallback<void(EnumerationPermission)>;
-
   // This class is created by WebRTC's signaling thread but used by WebRTC's
   // worker thread |task_runner|.
   CONTENT_EXPORT FilteringNetworkManager(
       rtc::NetworkManager* network_manager,
       const GURL& requesting_origin,
-      media::MediaPermission* media_permission,
-      OnEnumerationPermissionCallback callback);
+      media::MediaPermission* media_permission);
 
   CONTENT_EXPORT ~FilteringNetworkManager() override;
 
@@ -58,8 +51,6 @@
   void StartUpdating() override;
   void StopUpdating() override;
   void GetNetworks(NetworkList* networks) const override;
-  bool GetDefaultLocalAddress(int family,
-                              rtc::IPAddress* ipaddress) const override;
 
   webrtc::MdnsResponderInterface* GetMdnsResponder() const override;
 
@@ -71,8 +62,6 @@
   // available.
   void OnPermissionStatus(bool granted);
 
-  void SetEnumerationPermissionAndNotify(EnumerationPermission state);
-
   base::WeakPtr<FilteringNetworkManager> GetWeakPtr();
 
   // Receive callback from the wrapped NetworkManager when the underneath
@@ -126,8 +115,6 @@
 
   GURL requesting_origin_;
 
-  OnEnumerationPermissionCallback on_enumeration_permission_cb_;
-
   base::WeakPtrFactory<FilteringNetworkManager> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(FilteringNetworkManager);
diff --git a/content/renderer/p2p/filtering_network_manager_unittest.cc b/content/renderer/p2p/filtering_network_manager_unittest.cc
index 1a4c424..7821bcbb 100644
--- a/content/renderer/p2p/filtering_network_manager_unittest.cc
+++ b/content/renderer/p2p/filtering_network_manager_unittest.cc
@@ -8,8 +8,8 @@
 
 #include <memory>
 #include <utility>
+#include <vector>
 
-#include "base/bind_helpers.h"
 #include "base/logging.h"
 #include "base/memory/ref_counted.h"
 #include "base/stl_util.h"
@@ -17,10 +17,12 @@
 #include "base/threading/thread_task_runner_handle.h"
 #include "content/renderer/p2p/empty_network_manager.h"
 #include "media/base/media_permission.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/webrtc/rtc_base/ip_address.h"
 
 using NetworkList = rtc::NetworkManager::NetworkList;
+using ::testing::SizeIs;
 
 namespace {
 
@@ -31,8 +33,14 @@
   CAMERA_GRANTED,  // Receive camera permission granted.
   START_UPDATING,  // Client calls StartUpdating() on FilteringNetworkManager.
   STOP_UPDATING,   // Client calls StopUpdating() on FilteringNetworkManager.
-  MOCK_NETWORKS_CHANGED,  // MockNetworkManager has signaled networks changed
-                          // event.
+  MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK,   // MockNetworkManager has signaled
+                                            // networks changed event and the
+                                            // underlying network is replaced by
+                                            // a new one.
+  MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK,  // MockNetworkManager has signaled
+                                            // networks changed event but the
+                                            // underlying network stays the
+                                            // same.
 };
 
 enum ResultType {
@@ -48,13 +56,21 @@
   ResultType expected_result;
 };
 
-class MockNetworkManager : public rtc::NetworkManager {
+class EmptyMdnsResponder : public webrtc::MdnsResponderInterface {
  public:
-  MockNetworkManager() {
-    network_.reset(new rtc::Network("test_eth0", "Test Network Adapter 1",
-                                    rtc::IPAddress(0x12345600U), 24,
-                                    rtc::ADAPTER_TYPE_ETHERNET));
+  void CreateNameForAddress(const rtc::IPAddress& addr,
+                            NameCreatedCallback callback) override {
+    NOTREACHED();
   }
+  void RemoveNameForAddress(const rtc::IPAddress& addr,
+                            NameRemovedCallback callback) override {
+    NOTREACHED();
+  }
+};
+
+class MockNetworkManager : public rtc::NetworkManagerBase {
+ public:
+  MockNetworkManager() : mdns_responder_(new EmptyMdnsResponder()) {}
   // Mimic the current behavior that once the first signal is sent, any future
   // StartUpdating() will trigger another one.
   void StartUpdating() override {
@@ -71,9 +87,19 @@
     SignalNetworksChanged();
   }
 
+  webrtc::MdnsResponderInterface* GetMdnsResponder() const override {
+    return mdns_responder_.get();
+  }
+
+  void CopyAndSetNetwork(const rtc::Network& network) {
+    network_ = std::make_unique<rtc::Network>(network);
+    network_->AddIP(network_->GetBestIP());
+  }
+
  private:
   bool sent_first_update_ = false;
   std::unique_ptr<rtc::Network> network_;
+  std::unique_ptr<EmptyMdnsResponder> mdns_responder_;
 };
 
 class MockMediaPermission : public media::MediaPermission {
@@ -132,19 +158,27 @@
   FilteringNetworkManagerTest()
       : media_permission_(new MockMediaPermission()),
         task_runner_(new base::TestSimpleTaskRunner()),
-        task_runner_handle_(task_runner_) {}
+        task_runner_handle_(task_runner_) {
+    networks_.emplace_back("test_eth0", "Test Network Adapter 1",
+                           rtc::IPAddress(0x12345600U), 24,
+                           rtc::ADAPTER_TYPE_ETHERNET),
+        networks_.back().AddIP(rtc::IPAddress(0x12345678));
+    networks_.emplace_back("test_eth1", "Test Network Adapter 2",
+                           rtc::IPAddress(0x87654300U), 24,
+                           rtc::ADAPTER_TYPE_ETHERNET),
+        networks_.back().AddIP(rtc::IPAddress(0x87654321));
+  }
+
   void SetupNetworkManager(bool multiple_routes_requested) {
-    mock_network_manager_.reset(new MockNetworkManager());
+    base_network_manager_ = std::make_unique<MockNetworkManager>();
+    SetNewNetworkForBaseNetworkManager();
     if (multiple_routes_requested) {
-      FilteringNetworkManager* filtering_network_manager =
-          new FilteringNetworkManager(mock_network_manager_.get(), GURL(),
-                                      media_permission_.get(),
-                                      base::DoNothing());
-      filtering_network_manager->Initialize();
-      network_manager_.reset(filtering_network_manager);
+      network_manager_ = std::make_unique<FilteringNetworkManager>(
+          base_network_manager_.get(), GURL(), media_permission_.get());
+      network_manager_->Initialize();
     } else {
-      network_manager_.reset(
-          new EmptyNetworkManager(mock_network_manager_.get()));
+      network_manager_ =
+          std::make_unique<EmptyNetworkManager>(base_network_manager_.get());
     }
     network_manager_->SignalNetworksChanged.connect(
         this, &FilteringNetworkManagerTest::OnNetworksChanged);
@@ -157,6 +191,11 @@
     }
   }
 
+  void SetNewNetworkForBaseNetworkManager() {
+    base_network_manager_->CopyAndSetNetwork(networks_[next_new_network_id_]);
+    next_new_network_id_ = (next_new_network_id_ + 1) % networks_.size();
+  }
+
   ResultType ProcessEvent(EventType event) {
     clear_callback_called();
     switch (event) {
@@ -174,8 +213,12 @@
       case STOP_UPDATING:
         network_manager_->StopUpdating();
         break;
-      case MOCK_NETWORKS_CHANGED:
-        mock_network_manager_->SendNetworksChanged();
+      case MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK:
+        SetNewNetworkForBaseNetworkManager();
+        base_network_manager_->SendNetworksChanged();
+        break;
+      case MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK:
+        base_network_manager_->SendNetworksChanged();
         break;
     }
 
@@ -205,10 +248,13 @@
 
   bool callback_called_ = false;
   std::unique_ptr<rtc::NetworkManager> network_manager_;
-  std::unique_ptr<MockNetworkManager> mock_network_manager_;
+  std::unique_ptr<MockNetworkManager> base_network_manager_;
 
   std::unique_ptr<MockMediaPermission> media_permission_;
 
+  std::vector<rtc::Network> networks_;
+  int next_new_network_id_ = 0;
+
   NetworkList network_list_;
   scoped_refptr<base::TestSimpleTaskRunner> task_runner_;
   base::ThreadTaskRunnerHandle task_runner_handle_;
@@ -221,18 +267,21 @@
   TestEntry tests[] = {
       // Underneath network manager signals, no callback as StartUpdating() is
       // not called.
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       // StartUpdating() is called, should receive callback as the multiple
       // routes is not requested.
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
-      // Further network signal should trigger callback, since the default
-      // network could have changed.
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_BLOCKED},
-      // New StartUpdating() should trigger callback.
+      // Further network signal should trigger callback, since the
+      // EmptyNetworkManager always forwards the signal from the base network
+      // manager if there is any outstanding StartUpdate();
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, SIGNAL_ENUMERATION_BLOCKED},
+      // StartUpdating() always triggers callback after we have sent the first
+      // network update.
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
       {STOP_UPDATING, NO_SIGNAL},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      // No outstanding StartUpdating(), no more signal.
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -244,21 +293,22 @@
   SetupNetworkManager(true);
 
   TestEntry tests[] = {
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       // Both mic and camera are denied.
       {MIC_DENIED, NO_SIGNAL},
       {CAMERA_DENIED, NO_SIGNAL},
       // Once StartUpdating() is called, signal network changed event with
       // ENUMERATION_BLOCKED.
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
-      // Further network signal should trigger callback, since the default
-      // network could have changed.
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_BLOCKED},
-      // New StartUpdating() should trigger callback.
+      // Further network signal should not trigger callback, since the set of
+      // networks does not change after merging.
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
+      // Signal when observing a change after merging while there is any
+      // outstanding StartUpdate();
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, SIGNAL_ENUMERATION_BLOCKED},
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
       {STOP_UPDATING, NO_SIGNAL},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -271,8 +321,10 @@
   SetupNetworkManager(true);
 
   TestEntry tests[] = {
+      // StartUpdating() should not fire the event before we send the first
+      // update.
       {START_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       {MIC_DENIED, NO_SIGNAL},
       // The last permission check being denied should immediately trigger the
       // networks changed signal, since we already have an updated network list.
@@ -280,7 +332,8 @@
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
       {STOP_UPDATING, NO_SIGNAL},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      // No outstanding StartUpdating(), no more signal.
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -297,11 +350,10 @@
       {START_UPDATING, NO_SIGNAL},
       {MIC_DENIED, NO_SIGNAL},
       {CAMERA_DENIED, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_BLOCKED},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, SIGNAL_ENUMERATION_BLOCKED},
       {START_UPDATING, SIGNAL_ENUMERATION_BLOCKED},
       {STOP_UPDATING, NO_SIGNAL},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -316,19 +368,19 @@
   TestEntry tests[] = {
       {START_UPDATING, NO_SIGNAL},
       {MIC_DENIED, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
-      // Once one media type is granted, signal networkschanged with
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
+      // Once one media type is granted, signal networks changed with
       // ENUMERATION_ALLOWED.
       {CAMERA_GRANTED, SIGNAL_ENUMERATION_ALLOWED},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
       // If there is any outstanding StartUpdating(), new event from underneath
       // network manger should trigger SignalNetworksChanged.
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
       // No outstanding StartUpdating(), no more signal.
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -341,17 +393,20 @@
 
   TestEntry tests[] = {
       {MIC_DENIED, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       {CAMERA_GRANTED, NO_SIGNAL},
-      // StartUpdating() should trigger the event since at least one media is
-      // granted and network information is populated.
+      // StartUpdating() should signal the event with the status of permissions
+      // granted.
       {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
       {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      // Signal when observing a change after merging while there is any
+      // outstanding StartUpdate();
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      // No outstanding StartUpdating(), no more signal.
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
@@ -368,17 +423,71 @@
       {CAMERA_GRANTED, NO_SIGNAL},
       // Underneath network manager's signal networks changed should trigger
       // SignalNetworksChanged with ENUMERATION_ALLOWED.
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, SIGNAL_ENUMERATION_ALLOWED},
       {MIC_DENIED, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, SIGNAL_ENUMERATION_ALLOWED},
       {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, SIGNAL_ENUMERATION_ALLOWED},
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, SIGNAL_ENUMERATION_ALLOWED},
       {STOP_UPDATING, NO_SIGNAL},
-      {MOCK_NETWORKS_CHANGED, NO_SIGNAL},
+      {MOCK_NETWORKS_CHANGED_WITH_NEW_NETWORK, NO_SIGNAL},
   };
 
   RunTests(tests, base::size(tests));
 }
 
+// Test that the networks provided by the GetNetworks() and
+// GetAnyAddressNetworks() are not associated with an mDNS responder if the
+// enumeration permission is granted.
+TEST_F(FilteringNetworkManagerTest, NullMdnsResponderAfterPermissionGranted) {
+  SetupNetworkManager(true);
+
+  TestEntry setup_steps[] = {
+      {MOCK_NETWORKS_CHANGED_WITH_SAME_NETWORK, NO_SIGNAL},
+      // Both mic and camera are granted.
+      {MIC_GRANTED, NO_SIGNAL},
+      {CAMERA_GRANTED, NO_SIGNAL},
+      // Once StartUpdating() is called, signal network changed event with
+      // ENUMERATION_ALLOWED.
+      {START_UPDATING, SIGNAL_ENUMERATION_ALLOWED},
+  };
+  RunTests(setup_steps, base::size(setup_steps));
+
+  NetworkList networks;
+  network_manager_->GetNetworks(&networks);
+  EXPECT_THAT(networks, SizeIs(1u));
+  for (const rtc::Network* network : networks) {
+    EXPECT_EQ(nullptr, network->GetMdnsResponder());
+  }
+
+  networks.clear();
+  network_manager_->GetAnyAddressNetworks(&networks);
+  EXPECT_THAT(networks, SizeIs(2u));
+  for (const rtc::Network* network : networks) {
+    EXPECT_EQ(nullptr, network->GetMdnsResponder());
+  }
+}
+
+// Test the networks on the default routes given by GetAnyAddressNetworks() are
+// associated with an mDNS responder if the enumeration is blocked.
+TEST_F(FilteringNetworkManagerTest,
+       ProvideMdnsResponderForDefaultRouteAfterPermissionDenied) {
+  SetupNetworkManager(true);
+  // By default, the enumeration is blocked if we provide |media_permission_|;
+  EXPECT_EQ(rtc::NetworkManager::ENUMERATION_BLOCKED,
+            network_manager_->enumeration_permission());
+
+  NetworkList networks;
+  network_manager_->GetNetworks(&networks);
+  EXPECT_TRUE(networks.empty());
+
+  network_manager_->GetAnyAddressNetworks(&networks);
+  EXPECT_THAT(networks, SizeIs(2u));
+  EXPECT_NE(nullptr, network_manager_->GetMdnsResponder());
+  for (const rtc::Network* network : networks) {
+    EXPECT_EQ(network_manager_->GetMdnsResponder(),
+              network->GetMdnsResponder());
+  }
+}
+
 }  // namespace content
diff --git a/content/renderer/p2p/ipc_network_manager.cc b/content/renderer/p2p/ipc_network_manager.cc
index 987aa861..e2401e4 100644
--- a/content/renderer/p2p/ipc_network_manager.cc
+++ b/content/renderer/p2p/ipc_network_manager.cc
@@ -5,21 +5,20 @@
 #include "content/renderer/p2p/ipc_network_manager.h"
 
 #include <string>
+#include <utility>
+
 #include "base/bind.h"
 #include "base/command_line.h"
-#include "base/feature_list.h"
 #include "base/location.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
 #include "base/sys_byteorder.h"
 #include "base/threading/thread_task_runner_handle.h"
-#include "content/public/common/content_features.h"
 #include "content/public/common/content_switches.h"
 #include "jingle/glue/utils.h"
 #include "net/base/ip_address.h"
 #include "net/base/network_change_notifier.h"
 #include "net/base/network_interfaces.h"
-#include "net/net_buildflags.h"
 #include "third_party/webrtc/rtc_base/socket_address.h"
 
 namespace content {
@@ -46,8 +45,12 @@
 
 }  // namespace
 
-IpcNetworkManager::IpcNetworkManager(NetworkListManager* network_list_manager)
-    : network_list_manager_(network_list_manager), weak_factory_(this) {
+IpcNetworkManager::IpcNetworkManager(
+    NetworkListManager* network_list_manager,
+    std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder)
+    : network_list_manager_(network_list_manager),
+      mdns_responder_(std::move(mdns_responder)),
+      weak_factory_(this) {
   network_list_manager_->AddNetworkListObserver(this);
 }
 
@@ -187,11 +190,6 @@
                            stats.ipv6_network_count);
 }
 
-void IpcNetworkManager::SetMdnsResponder(
-    std::unique_ptr<MdnsResponderAdapter> mdns_responder) {
-  mdns_responder_ = std::move(mdns_responder);
-}
-
 webrtc::MdnsResponderInterface* IpcNetworkManager::GetMdnsResponder() const {
   return mdns_responder_.get();
 }
diff --git a/content/renderer/p2p/ipc_network_manager.h b/content/renderer/p2p/ipc_network_manager.h
index 3e1657b..3c39178 100644
--- a/content/renderer/p2p/ipc_network_manager.h
+++ b/content/renderer/p2p/ipc_network_manager.h
@@ -11,7 +11,6 @@
 #include "base/compiler_specific.h"
 #include "base/memory/weak_ptr.h"
 #include "content/common/content_export.h"
-#include "content/renderer/p2p/mdns_responder_adapter.h"
 #include "content/renderer/p2p/network_list_manager.h"
 #include "content/renderer/p2p/network_list_observer.h"
 #include "third_party/webrtc/rtc_base/mdns_responder_interface.h"
@@ -29,7 +28,9 @@
                           public NetworkListObserver {
  public:
   // Constructor doesn't take ownership of the |network_list_manager|.
-  CONTENT_EXPORT IpcNetworkManager(NetworkListManager* network_list_manager);
+  CONTENT_EXPORT IpcNetworkManager(
+      NetworkListManager* network_list_manager,
+      std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder);
   ~IpcNetworkManager() override;
 
   // rtc:::NetworkManager:
@@ -43,13 +44,11 @@
       const net::IPAddress& default_ipv4_local_address,
       const net::IPAddress& default_ipv6_local_address) override;
 
-  void SetMdnsResponder(std::unique_ptr<MdnsResponderAdapter> mdns_responder);
-
  private:
   void SendNetworksChangedSignal();
 
   NetworkListManager* network_list_manager_;
-  std::unique_ptr<MdnsResponderAdapter> mdns_responder_;
+  std::unique_ptr<webrtc::MdnsResponderInterface> mdns_responder_;
   int start_count_ = 0;
   bool network_list_received_ = false;
 
diff --git a/content/renderer/p2p/ipc_network_manager_unittest.cc b/content/renderer/p2p/ipc_network_manager_unittest.cc
index 06bb29c..e85e4b9 100644
--- a/content/renderer/p2p/ipc_network_manager_unittest.cc
+++ b/content/renderer/p2p/ipc_network_manager_unittest.cc
@@ -12,6 +12,7 @@
 #include "net/base/network_change_notifier.h"
 #include "net/base/network_interfaces.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/webrtc/rtc_base/mdns_responder_interface.h"
 
 namespace content {
 
@@ -28,6 +29,14 @@
   ~MockP2PSocketDispatcher() override {}
 };
 
+class EmptyMdnsResponder : public webrtc::MdnsResponderInterface {
+ public:
+  void CreateNameForAddress(const rtc::IPAddress& addr,
+                            NameCreatedCallback callback) override {}
+  void RemoveNameForAddress(const rtc::IPAddress& addr,
+                            NameRemovedCallback callback) override {}
+};
+
 }  // namespace
 
 // 2 IPv6 addresses with only last digit different.
@@ -41,7 +50,9 @@
  public:
   IpcNetworkManagerTest()
       : network_list_manager_(new MockP2PSocketDispatcher()),
-        network_manager_(new IpcNetworkManager(network_list_manager_.get())) {}
+        network_manager_(std::make_unique<IpcNetworkManager>(
+            network_list_manager_.get(),
+            std::make_unique<EmptyMdnsResponder>())) {}
 
  protected:
   std::unique_ptr<MockP2PSocketDispatcher> network_list_manager_;
@@ -159,4 +170,32 @@
   EXPECT_EQ(rtc::ADAPTER_TYPE_WIFI, (*tun2)->type());
 }
 
+// Test that IpcNetworkManager will act as the mDNS responder provider for
+// all networks that it returns.
+TEST_F(IpcNetworkManagerTest,
+       ServeAsMdnsResponderProviderForNetworksEnumerated) {
+  net::NetworkInterfaceList list;
+  // Add networks.
+  net::IPAddress ip;
+  EXPECT_TRUE(ip.AssignFromIPLiteral(kIPv6PublicAddrString1));
+  list.push_back(net::NetworkInterface(
+      "em1", "em1", 0, net::NetworkChangeNotifier::CONNECTION_UNKNOWN, ip, 64,
+      net::IP_ADDRESS_ATTRIBUTE_NONE));
+
+  network_manager_->OnNetworkListChanged(list, net::IPAddress(),
+                                         net::IPAddress());
+  std::vector<rtc::Network*> networks;
+  network_manager_->GetNetworks(&networks);
+
+  ASSERT_EQ(1u, networks.size());
+  webrtc::MdnsResponderInterface* const mdns_responder =
+      network_manager_->GetMdnsResponder();
+  EXPECT_EQ(mdns_responder, networks[0]->GetMdnsResponder());
+  networks.clear();
+  network_manager_->GetAnyAddressNetworks(&networks);
+  ASSERT_EQ(2u, networks.size());
+  EXPECT_EQ(mdns_responder, networks[0]->GetMdnsResponder());
+  EXPECT_EQ(mdns_responder, networks[1]->GetMdnsResponder());
+}
+
 }  // namespace content
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 6de30c50..5e1787e 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -977,11 +977,10 @@
 void RenderWidget::RequestPresentation(PresentationTimeCallback callback) {
   layer_tree_view_->layer_tree_host()->RequestPresentationTimeForNextFrame(
       std::move(callback));
-  layer_tree_view_->layer_tree_host()->SetNeedsCommitWithForcedRedraw();
-  // In web tests SetNeedsCommitWithForcedRedraw() does not actually cause a
-  // commit, because the compositor is scheduled by blink to avoid test
-  // flakiness. So for this case we must request a main frame the way blink
-  // would.
+  layer_tree_view_->SetNeedsForcedRedraw();
+
+  // Need this since single thread mode doesn't have a scheduler so the above
+  // call won't cause us to generate a new frame.
   ScheduleAnimation();
 }
 
@@ -2821,8 +2820,8 @@
       *result = int_value;
       return true;
     } else {
-      DLOG(WARNING) << "Failed to parse switch " << switch_string << ": "
-                    << string_value;
+      LOG(WARNING) << "Failed to parse switch " << switch_string << ": "
+                   << string_value;
       return false;
     }
   };
@@ -3305,17 +3304,6 @@
       target_offset, use_anchor, new_page_scale, duration);
 }
 
-void RenderWidget::RequestDecode(const cc::PaintImage& image,
-                                 base::OnceCallback<void(bool)> callback) {
-  layer_tree_view_->layer_tree_host()->QueueImageDecode(image,
-                                                        std::move(callback));
-  // QueueImageDecode will request a commit and main frame to occur, however:
-  // In web tests SetNeedsCommit() does not actually cause a commit, because the
-  // compositor is scheduled by blink to avoid test flakiness. So for this case
-  // we must request a main frame the way blink would.
-  ScheduleAnimation();
-}
-
 void RenderWidget::RequestUnbufferedInputEvents() {
   if (input_event_queue_)
     input_event_queue_->RequestUnbufferedInputEvents();
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index 5c2893c..dad344a 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -443,8 +443,6 @@
                                bool use_anchor,
                                float new_page_scale,
                                double duration_sec) override;
-  void RequestDecode(const cc::PaintImage& image,
-                     base::OnceCallback<void(bool)> callback) override;
 
   // Override point to obtain that the current input method state and caret
   // position.
@@ -638,13 +636,6 @@
   // RenderWidget IPC message handler that can be overridden by subclasses.
   virtual void OnSynchronizeVisualProperties(const VisualProperties& params);
 
-  bool in_synchronous_composite_for_testing() const {
-    return in_synchronous_composite_for_testing_;
-  }
-  void set_in_synchronous_composite_for_testing(bool in) {
-    in_synchronous_composite_for_testing_ = in;
-  }
-
   // Called by Create() functions and subclasses to finish initialization.
   // |show_callback| will be invoked once WebWidgetClient::Show() occurs, and
   // should be null if Show() won't be triggered for this widget.
@@ -989,9 +980,6 @@
   // process, without the use of this mode, however it would be overridden by
   // the browser if they disagree.
   bool synchronous_resize_mode_for_testing_ = false;
-  // In web tests, synchronous composites should not be nested inside another
-  // composite, and this bool is used to guard against that.
-  bool in_synchronous_composite_for_testing_ = false;
 
   // Stores information about the current text input.
   blink::WebTextInputInfo text_input_info_;
diff --git a/content/renderer/service_worker/controller_service_worker_impl.cc b/content/renderer/service_worker/controller_service_worker_impl.cc
index 22ba334..fdbc316 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.cc
+++ b/content/renderer/service_worker/controller_service_worker_impl.cc
@@ -6,7 +6,6 @@
 
 #include "base/sequenced_task_runner.h"
 #include "content/renderer/service_worker/service_worker_context_client.h"
-#include "third_party/blink/public/common/service_worker/service_worker_utils.h"
 
 namespace content {
 
@@ -16,7 +15,6 @@
     scoped_refptr<base::SequencedTaskRunner> task_runner)
     : context_client_(std::move(context_client)),
       task_runner_(std::move(task_runner)) {
-  CHECK(blink::ServiceWorkerUtils::IsServicificationEnabled());
   bindings_.AddBinding(this, std::move(request), task_runner_);
 }
 
@@ -24,7 +22,7 @@
 
 void ControllerServiceWorkerImpl::Clone(
     blink::mojom::ControllerServiceWorkerRequest request) {
-  CHECK(task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
   bindings_.AddBinding(this, std::move(request), task_runner_);
 }
 
@@ -32,8 +30,8 @@
     blink::mojom::DispatchFetchEventParamsPtr params,
     blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
-  CHECK(task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_client_);
+  DCHECK(task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_client_);
   context_client_->DispatchOrQueueFetchEvent(
       std::move(params), std::move(response_callback), std::move(callback));
 }
diff --git a/content/renderer/service_worker/controller_service_worker_impl.h b/content/renderer/service_worker/controller_service_worker_impl.h
index 2e9dae5c..c05ab0b 100644
--- a/content/renderer/service_worker/controller_service_worker_impl.h
+++ b/content/renderer/service_worker/controller_service_worker_impl.h
@@ -55,6 +55,8 @@
   // and by the controllees.
   mojo::BindingSet<blink::mojom::ControllerServiceWorker> bindings_;
 
+  // This should never be null because |context_client_| owns |this|.
+  // TODO(falken): Make this a raw pointer.
   base::WeakPtr<ServiceWorkerContextClient> context_client_;
 
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
diff --git a/content/renderer/service_worker/navigation_preload_request.cc b/content/renderer/service_worker/navigation_preload_request.cc
index 2e48071e..141e99b 100644
--- a/content/renderer/service_worker/navigation_preload_request.cc
+++ b/content/renderer/service_worker/navigation_preload_request.cc
@@ -46,7 +46,7 @@
   DCHECK(net::HttpResponseHeaders::IsRedirectResponseCode(
       response_head.headers->response_code()));
 
-  CHECK(owner_);
+  DCHECK(owner_);
   response_ = std::make_unique<blink::WebURLResponse>();
   WebURLLoaderImpl::PopulateURLResponse(url_, response_head, response_.get(),
                                         false /* report_security_info */,
@@ -106,7 +106,7 @@
     return;
   }
 
-  CHECK(owner_);
+  DCHECK(owner_);
   if (response_) {
     // When the response body from the server is empty, OnComplete() is called
     // without OnStartLoadingResponseBody().
@@ -123,7 +123,7 @@
 void NavigationPreloadRequest::MaybeReportResponseToOwner() {
   if (!response_ || !body_.is_valid())
     return;
-  CHECK(owner_);
+  DCHECK(owner_);
   owner_->OnNavigationPreloadResponse(fetch_event_id_, std::move(response_),
                                       std::move(body_));
 }
@@ -131,7 +131,7 @@
 void NavigationPreloadRequest::ReportErrorToOwner(
     const std::string& message,
     const std::string& unsanitized_message) {
-  CHECK(owner_);
+  DCHECK(owner_);
   // This will delete |this|.
   owner_->OnNavigationPreloadError(
       fetch_event_id_, std::make_unique<blink::WebServiceWorkerError>(
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 97cabf8..1b9eb29 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -117,7 +117,7 @@
 
 blink::WebServiceWorkerClientInfo ToWebServiceWorkerClientInfo(
     blink::mojom::ServiceWorkerClientInfoPtr client_info) {
-  CHECK(!client_info->client_uuid.empty());
+  DCHECK(!client_info->client_uuid.empty());
 
   blink::WebServiceWorkerClientInfo web_client_info;
 
@@ -194,7 +194,7 @@
       [](MapType* map, Args... args, int event_id,
          blink::mojom::ServiceWorkerEventStatus status) {
         auto iter = map->find(event_id);
-        CHECK(iter != map->end());
+        DCHECK(iter != map->end());
         std::move(iter->second).Run(status, std::forward<Args>(args)...);
         map->erase(iter);
       },
@@ -211,7 +211,7 @@
         weak_factory(owner),
         proxy_weak_factory(owner->proxy_) {}
 
-  ~WorkerContextData() { CHECK(thread_checker.CalledOnValidThread()); }
+  ~WorkerContextData() { DCHECK(thread_checker.CalledOnValidThread()); }
 
   mojo::Binding<blink::mojom::ServiceWorker> service_worker_binding;
 
@@ -304,8 +304,8 @@
       pending_controller_request_(std::move(controller_request)),
       owner_(owner),
       start_timing_(std::move(start_timing)) {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(owner_);
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(owner_);
   instance_host_ =
       blink::mojom::ThreadSafeEmbeddedWorkerInstanceHostAssociatedPtr::Create(
           std::move(instance_host), main_thread_task_runner_);
@@ -345,23 +345,17 @@
 }
 
 ServiceWorkerContextClient::~ServiceWorkerContextClient() {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
-  // TODO(crbug.com/907311): Remove this instrumentation after we identified
-  // the cause of crash.
-  if (report_debug_log_ && context_) {
-    CrashWithDebugLog("DTOR");
-  }
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
 }
 
 void ServiceWorkerContextClient::WorkerReadyForInspectionOnMainThread() {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
   (*instance_host_)->OnReadyForInspection();
 }
 
 void ServiceWorkerContextClient::WorkerContextFailedToStartOnMainThread() {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(!proxy_);
-  RecordDebugLog("WorkerContextFailedToStart");
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(!proxy_);
 
   (*instance_host_)->OnStopped();
 
@@ -373,7 +367,7 @@
 }
 
 void ServiceWorkerContextClient::FailedToLoadClassicScript() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "LOAD_SCRIPT", this,
                                   "Status", "FailedToLoadClassicScript");
   // Cleanly send an OnStopped() message instead of just breaking the
@@ -386,7 +380,7 @@
 }
 
 void ServiceWorkerContextClient::FailedToFetchModuleScript() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT_NESTABLE_ASYNC_END1("ServiceWorker", "LOAD_SCRIPT", this,
                                   "Status", "FailedToFetchModuleScript");
   // Cleanly send an OnStopped() message instead of just breaking the
@@ -399,14 +393,14 @@
 }
 
 void ServiceWorkerContextClient::WorkerScriptLoadedOnMainThread() {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(!is_starting_installed_worker_);
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(!is_starting_installed_worker_);
   (*instance_host_)->OnScriptLoaded();
   TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "LOAD_SCRIPT", this);
 }
 
 void ServiceWorkerContextClient::WorkerScriptLoadedOnWorkerThread() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   (*instance_host_)->OnScriptLoaded();
   TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "LOAD_SCRIPT", this);
 }
@@ -416,26 +410,18 @@
     scoped_refptr<base::SequencedTaskRunner> worker_task_runner) {
   DCHECK_NE(0, WorkerThread::GetCurrentId())
       << "service worker started on the main thread instead of a worker thread";
-  RecordDebugLog("WorkerContextStarted");
-  CHECK(worker_task_runner->RunsTasksInCurrentSequence());
-  CHECK(!worker_task_runner_);
+  DCHECK(worker_task_runner->RunsTasksInCurrentSequence());
+  DCHECK(!worker_task_runner_);
   worker_task_runner_ = std::move(worker_task_runner);
-  CHECK(!proxy_);
+  DCHECK(!proxy_);
   proxy_ = proxy;
 
-  // Initialize pending callback maps. This needs to be freed on the
-  // same thread before the worker context goes away in
-  // willDestroyWorkerContext.
-  if (context_) {
-    CrashWithDebugLog("WCS");
-    return;
-  }
   context_ = std::make_unique<WorkerContextData>(this);
 
-  CHECK(pending_service_worker_request_.is_pending());
-  CHECK(pending_controller_request_.is_pending());
-  CHECK(!context_->service_worker_binding.is_bound());
-  CHECK(!context_->controller_impl);
+  DCHECK(pending_service_worker_request_.is_pending());
+  DCHECK(pending_controller_request_.is_pending());
+  DCHECK(!context_->service_worker_binding.is_bound());
+  DCHECK(!context_->controller_impl);
   context_->service_worker_binding.Bind(
       std::move(pending_service_worker_request_), worker_task_runner_);
 
@@ -457,7 +443,7 @@
 }
 
 void ServiceWorkerContextClient::WillEvaluateScript() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   start_timing_->script_evaluation_start_time = base::TimeTicks::Now();
 
   // Temporary CHECK for https://crbug.com/881100
@@ -474,7 +460,7 @@
 }
 
 void ServiceWorkerContextClient::DidEvaluateScript(bool success) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   start_timing_->script_evaluation_end_time = base::TimeTicks::Now();
 
   // Temporary CHECK for https://crbug.com/881100
@@ -502,8 +488,7 @@
 
 void ServiceWorkerContextClient::DidInitializeWorkerContext(
     v8::Local<v8::Context> context) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  RecordDebugLog("DidInitializeWorkerContext");
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   GetContentClient()
       ->renderer()
       ->DidInitializeServiceWorkerContextOnWorkerThread(
@@ -513,12 +498,7 @@
 
 void ServiceWorkerContextClient::WillDestroyWorkerContext(
     v8::Local<v8::Context> context) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  RecordDebugLog("WillDestroyWorkerContext");
-  if (dispatching_fetch_event_) {
-    CrashWithDebugLog("WDWC_DFE");
-    return;
-  }
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
 
   // At this point WillStopCurrentWorkerThread is already called, so
   // worker_task_runner_->RunsTasksInCurrentSequence() returns false
@@ -536,8 +516,7 @@
 }
 
 void ServiceWorkerContextClient::WorkerContextDestroyed() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  RecordDebugLog("WorkerContextDestroyed");
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
 
   (*instance_host_)->OnStopped();
 
@@ -578,7 +557,9 @@
 void ServiceWorkerContextClient::DidHandleActivateEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
                          "ServiceWorkerContextClient::DidHandleActivateEvent",
                          TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -592,7 +573,9 @@
 void ServiceWorkerContextClient::DidHandleBackgroundFetchAbortEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleBackgroundFetchAbortEvent",
@@ -607,7 +590,9 @@
 void ServiceWorkerContextClient::DidHandleBackgroundFetchClickEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleBackgroundFetchClickEvent",
@@ -622,7 +607,9 @@
 void ServiceWorkerContextClient::DidHandleBackgroundFetchFailEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleBackgroundFetchFailEvent",
@@ -637,7 +624,9 @@
 void ServiceWorkerContextClient::DidHandleBackgroundFetchSuccessEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleBackgroundFetchSuccessEvent",
@@ -652,7 +641,9 @@
 void ServiceWorkerContextClient::DidHandleCookieChangeEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker", "ServiceWorkerContextClient::DidHandleCookieChangeEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -666,7 +657,9 @@
 void ServiceWorkerContextClient::DidHandleExtendableMessageEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleExtendableMessageEvent",
@@ -681,7 +674,9 @@
 void ServiceWorkerContextClient::DidHandleInstallEvent(
     int event_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
                          "ServiceWorkerContextClient::DidHandleInstallEvent",
                          TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -697,14 +692,16 @@
     int fetch_event_id,
     base::TimeTicks event_dispatch_time,
     base::TimeTicks respond_with_settled_time) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::RespondToFetchEventWithNoResponse",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
+  DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
   const blink::mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
       context_->fetch_response_callbacks[fetch_event_id];
 
@@ -721,13 +718,15 @@
     const blink::WebServiceWorkerResponse& web_response,
     base::TimeTicks event_dispatch_time,
     base::TimeTicks respond_with_settled_time) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker", "ServiceWorkerContextClient::RespondToFetchEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
+  DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
 
   blink::mojom::FetchAPIResponsePtr response(
       GetFetchAPIResponseFromWebResponse(web_response));
@@ -748,14 +747,16 @@
     blink::WebServiceWorkerStreamHandle* web_body_as_stream,
     base::TimeTicks event_dispatch_time,
     base::TimeTicks respond_with_settled_time) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::RespondToFetchEventWithResponseStream",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(fetch_event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
+  DCHECK(base::ContainsKey(context_->fetch_response_callbacks, fetch_event_id));
   blink::mojom::FetchAPIResponsePtr response(
       GetFetchAPIResponseFromWebResponse(web_response));
   const blink::mojom::ServiceWorkerFetchResponseCallbackPtr& response_callback =
@@ -765,7 +766,7 @@
   blink::mojom::ServiceWorkerStreamCallbackPtr callback_ptr;
   body_as_stream->callback_request = mojo::MakeRequest(&callback_ptr);
   body_as_stream->stream = web_body_as_stream->DrainStreamDataPipe();
-  CHECK(body_as_stream->stream.is_valid());
+  DCHECK(body_as_stream->stream.is_valid());
 
   web_body_as_stream->SetListener(std::make_unique<StreamHandleListener>(
       std::move(callback_ptr),
@@ -783,11 +784,9 @@
 void ServiceWorkerContextClient::DidHandleFetchEvent(
     int event_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  if (!context_) {
-    CrashWithDebugLog("DHFE");
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
     return;
-  }
   // This TRACE_EVENT is used for perf benchmark to confirm if all of fetch
   // events have completed. (crbug.com/736697)
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
@@ -804,14 +803,16 @@
   } else {
     // |fetch_response_callback| should be used before settling a promise for
     // waitUntil().
-    CHECK(!base::ContainsKey(context_->fetch_response_callbacks, event_id));
+    DCHECK(!base::ContainsKey(context_->fetch_response_callbacks, event_id));
   }
 }
 
 void ServiceWorkerContextClient::DidHandleNotificationClickEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleNotificationClickEvent",
@@ -826,7 +827,9 @@
 void ServiceWorkerContextClient::DidHandleNotificationCloseEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleNotificationCloseEvent",
@@ -841,11 +844,9 @@
 void ServiceWorkerContextClient::DidHandlePushEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  if (!context_) {
-    CrashWithDebugLog("DHPE");
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
     return;
-  }
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
                          "ServiceWorkerContextClient::DidHandlePushEvent",
                          TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -859,7 +860,9 @@
 void ServiceWorkerContextClient::DidHandleSyncEvent(
     int request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1("ServiceWorker",
                          "ServiceWorkerContextClient::DidHandleSyncEvent",
                          TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -873,13 +876,15 @@
 void ServiceWorkerContextClient::RespondToAbortPaymentEvent(
     int event_id,
     bool payment_aborted) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker", "ServiceWorkerContextClient::RespondToAbortPaymentEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(base::ContainsKey(context_->abort_payment_result_callbacks, event_id));
+  DCHECK(base::ContainsKey(context_->abort_payment_result_callbacks, event_id));
   const payments::mojom::PaymentHandlerResponseCallbackPtr& result_callback =
       context_->abort_payment_result_callbacks[event_id];
   result_callback->OnResponseForAbortPayment(payment_aborted);
@@ -889,7 +894,9 @@
 void ServiceWorkerContextClient::DidHandleAbortPaymentEvent(
     int event_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker", "ServiceWorkerContextClient::DidHandleAbortPaymentEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -905,14 +912,16 @@
 void ServiceWorkerContextClient::RespondToCanMakePaymentEvent(
     int event_id,
     bool can_make_payment) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::RespondToCanMakePaymentEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(event_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(
+  DCHECK(
       base::ContainsKey(context_->can_make_payment_result_callbacks, event_id));
   const payments::mojom::PaymentHandlerResponseCallbackPtr& result_callback =
       context_->can_make_payment_result_callbacks[event_id];
@@ -923,7 +932,9 @@
 void ServiceWorkerContextClient::DidHandleCanMakePaymentEvent(
     int event_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandleCanMakePaymentEvent",
@@ -940,15 +951,17 @@
 void ServiceWorkerContextClient::RespondToPaymentRequestEvent(
     int payment_request_id,
     const blink::WebPaymentHandlerResponse& web_response) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::RespondToPaymentRequestEvent",
       TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
                           TRACE_ID_LOCAL(payment_request_id)),
       TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT);
-  CHECK(base::ContainsKey(context_->payment_response_callbacks,
-                          payment_request_id));
+  DCHECK(base::ContainsKey(context_->payment_response_callbacks,
+                           payment_request_id));
   const payments::mojom::PaymentHandlerResponseCallbackPtr& response_callback =
       context_->payment_response_callbacks[payment_request_id];
   payments::mojom::PaymentHandlerResponsePtr response =
@@ -962,7 +975,9 @@
 void ServiceWorkerContextClient::DidHandlePaymentRequestEvent(
     int payment_request_id,
     blink::mojom::ServiceWorkerEventStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  if (!context_)
+    return;
   TRACE_EVENT_WITH_FLOW1(
       "ServiceWorker",
       "ServiceWorkerContextClient::DidHandlePaymentRequestEvent",
@@ -979,7 +994,7 @@
 
 std::unique_ptr<blink::WebServiceWorkerNetworkProvider>
 ServiceWorkerContextClient::CreateServiceWorkerNetworkProviderOnMainThread() {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
   return std::make_unique<ServiceWorkerNetworkProviderForServiceWorker>(
       service_worker_provider_info_->provider_id,
       std::move(service_worker_provider_info_->script_loader_factory_ptr_info));
@@ -988,8 +1003,8 @@
 scoped_refptr<blink::WebWorkerFetchContext>
 ServiceWorkerContextClient::CreateServiceWorkerFetchContextOnMainThread(
     blink::WebServiceWorkerNetworkProvider* provider) {
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(preference_watcher_request_.is_pending());
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(preference_watcher_request_.is_pending());
 
   scoped_refptr<ChildURLLoaderFactoryBundle> url_loader_factory_bundle;
   if (loader_factories_) {
@@ -999,7 +1014,7 @@
                                     ->blink_platform_impl()
                                     ->CreateDefaultURLLoaderFactoryBundle();
   }
-  CHECK(url_loader_factory_bundle);
+  DCHECK(url_loader_factory_bundle);
 
   std::unique_ptr<network::SharedURLLoaderFactoryInfo>
       script_loader_factory_info;
@@ -1026,16 +1041,20 @@
 }
 
 int ServiceWorkerContextClient::WillStartTask() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // This is called from the Blink's code running in the worker thread and we
+  // expect |context_| to still be alive.
+  DCHECK(context_);
+  DCHECK(context_->timeout_timer);
   return context_->timeout_timer->StartEvent(base::DoNothing());
 }
 
 void ServiceWorkerContextClient::DidEndTask(int task_id) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // This is called from the Blink's code running in the worker thread and we
+  // expect |context_| to still be alive.
+  DCHECK(context_);
+  DCHECK(context_->timeout_timer);
   // Check if the task is still alive, since the timeout timer might have
   // already timed it out (which calls the abort callback passed to StartEvent()
   // but that does nothing, since we just check HasEvent() here instead of
@@ -1048,11 +1067,9 @@
     blink::mojom::DispatchFetchEventParamsPtr params,
     blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  if (!context_) {
-    CrashWithDebugLog("DOQFE");
-    return;
-  }
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   TRACE_EVENT2("ServiceWorker",
                "ServiceWorkerContextClient::DispatchOrQueueFetchEvent", "url",
                params->request->url.spec(), "queued",
@@ -1072,7 +1089,9 @@
     bool last_chance,
     base::TimeDelta timeout,
     DispatchSyncEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEventWithCustomTimeout(
       CreateAbortCallback(&context_->sync_event_callbacks), timeout);
   context_->sync_event_callbacks.emplace(request_id, std::move(callback));
@@ -1091,7 +1110,9 @@
 void ServiceWorkerContextClient::DispatchAbortPaymentEvent(
     payments::mojom::PaymentHandlerResponseCallbackPtr response_callback,
     DispatchAbortPaymentEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // Valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int event_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->abort_payment_event_callbacks));
   context_->abort_payment_event_callbacks.emplace(event_id,
@@ -1110,7 +1131,9 @@
     payments::mojom::CanMakePaymentEventDataPtr eventData,
     payments::mojom::PaymentHandlerResponseCallbackPtr response_callback,
     DispatchCanMakePaymentEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // Valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int event_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->can_make_payment_event_callbacks));
   context_->can_make_payment_event_callbacks.emplace(event_id,
@@ -1133,7 +1156,9 @@
     payments::mojom::PaymentRequestEventDataPtr eventData,
     payments::mojom::PaymentHandlerResponseCallbackPtr response_callback,
     DispatchPaymentRequestEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // Valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int event_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->payment_request_event_callbacks));
   context_->payment_request_event_callbacks.emplace(event_id,
@@ -1156,7 +1181,7 @@
     int fetch_event_id,
     std::unique_ptr<blink::WebURLResponse> response,
     mojo::ScopedDataPipeConsumerHandle data_pipe) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::OnNavigationPreloadResponse",
@@ -1170,7 +1195,9 @@
 void ServiceWorkerContextClient::OnNavigationPreloadError(
     int fetch_event_id,
     std::unique_ptr<blink::WebServiceWorkerError> error) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| owns NavigationPreloadRequest which calls this.
+  DCHECK(context_);
   TRACE_EVENT_WITH_FLOW0("ServiceWorker",
                          "ServiceWorkerContextClient::OnNavigationPreloadError",
                          TRACE_ID_WITH_SCOPE(kServiceWorkerContextClientScope,
@@ -1186,7 +1213,9 @@
     int64_t encoded_data_length,
     int64_t encoded_body_length,
     int64_t decoded_body_length) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| owns NavigationPreloadRequest which calls this.
+  DCHECK(context_);
   TRACE_EVENT_WITH_FLOW0(
       "ServiceWorker",
       "ServiceWorkerContextClient::OnNavigationPreloadComplete",
@@ -1203,7 +1232,7 @@
     blink::mojom::FetchAPIRequestPtr request,
     const std::string& client_id,
     blink::WebServiceWorkerRequest* web_request) {
-  CHECK(web_request);
+  DCHECK(web_request);
   web_request->SetURL(blink::WebURL(request->url));
   web_request->SetMethod(blink::WebString::FromUTF8(request->method));
   for (const auto& pair : request->headers) {
@@ -1216,7 +1245,7 @@
   }
 
   // The body is provided in |request->body|.
-  CHECK(!request->blob);
+  DCHECK(!request->blob);
   if (request->body) {
     std::vector<blink::mojom::BlobPtrInfo> blob_ptrs;
     if (!base::FeatureList::IsEnabled(network::features::kNetworkService)) {
@@ -1259,14 +1288,16 @@
 
 void ServiceWorkerContextClient::SendWorkerStarted(
     blink::mojom::ServiceWorkerStartStatus status) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because this task was posted to |worker_task_runner_|.
+  DCHECK(context_);
 
   if (GetContentClient()->renderer()) {  // nullptr in unit_tests.
     GetContentClient()->renderer()->DidStartServiceWorkerContextOnWorkerThread(
         service_worker_version_id_, service_worker_scope_, script_url_);
   }
 
-  // Temporary CHECK for https://crbug.com/881100
+  // Temporary DCHECK for https://crbug.com/881100
   int64_t t0 =
       start_timing_->start_worker_received_time.since_origin().InMicroseconds();
   int64_t t1 = start_timing_->script_evaluation_start_time.since_origin()
@@ -1285,8 +1316,6 @@
       ->OnStarted(status, WorkerThread::GetCurrentId(),
                   std::move(start_timing_));
 
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
   context_->timeout_timer->Start();
   TRACE_EVENT_NESTABLE_ASYNC_END0("ServiceWorker", "ServiceWorkerContextClient",
                                   this);
@@ -1294,7 +1323,9 @@
 
 void ServiceWorkerContextClient::DispatchActivateEvent(
     DispatchActivateEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->activate_event_callbacks));
   context_->activate_event_callbacks.emplace(request_id, std::move(callback));
@@ -1309,7 +1340,9 @@
 void ServiceWorkerContextClient::DispatchBackgroundFetchAbortEvent(
     blink::mojom::BackgroundFetchRegistrationPtr registration,
     DispatchBackgroundFetchAbortEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->background_fetch_abort_event_callbacks));
   context_->background_fetch_abort_event_callbacks.emplace(request_id,
@@ -1328,7 +1361,9 @@
 void ServiceWorkerContextClient::DispatchBackgroundFetchClickEvent(
     blink::mojom::BackgroundFetchRegistrationPtr registration,
     DispatchBackgroundFetchClickEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->background_fetch_click_event_callbacks));
   context_->background_fetch_click_event_callbacks.emplace(request_id,
@@ -1347,7 +1382,9 @@
 void ServiceWorkerContextClient::DispatchBackgroundFetchFailEvent(
     blink::mojom::BackgroundFetchRegistrationPtr registration,
     DispatchBackgroundFetchFailEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->background_fetch_fail_event_callbacks));
   context_->background_fetch_fail_event_callbacks.emplace(request_id,
@@ -1366,7 +1403,9 @@
 void ServiceWorkerContextClient::DispatchBackgroundFetchSuccessEvent(
     blink::mojom::BackgroundFetchRegistrationPtr registration,
     DispatchBackgroundFetchSuccessEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->background_fetched_event_callbacks));
   context_->background_fetched_event_callbacks.emplace(request_id,
@@ -1385,14 +1424,14 @@
 void ServiceWorkerContextClient::InitializeGlobalScope(
     blink::mojom::ServiceWorkerHostAssociatedPtrInfo service_worker_host,
     blink::mojom::ServiceWorkerRegistrationObjectInfoPtr registration_info) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   // Connect to the blink::mojom::ServiceWorkerHost.
   proxy_->BindServiceWorkerHost(service_worker_host.PassHandle());
   // Set ServiceWorkerGlobalScope#registration.
   DCHECK_NE(registration_info->registration_id,
             blink::mojom::kInvalidServiceWorkerRegistrationId);
-  CHECK(registration_info->host_ptr_info.is_valid());
-  CHECK(registration_info->request.is_pending());
+  DCHECK(registration_info->host_ptr_info.is_valid());
+  DCHECK(registration_info->request.is_pending());
   proxy_->SetRegistration(
       registration_info.To<blink::WebServiceWorkerRegistrationObjectInfo>());
 
@@ -1401,7 +1440,9 @@
 
 void ServiceWorkerContextClient::DispatchInstallEvent(
     DispatchInstallEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int event_id = context_->timeout_timer->StartEvent(CreateAbortCallback(
       &context_->install_event_callbacks, false /* has_fetch_handler */));
   context_->install_event_callbacks.emplace(event_id, std::move(callback));
@@ -1417,7 +1458,9 @@
 void ServiceWorkerContextClient::DispatchExtendableMessageEvent(
     blink::mojom::ExtendableMessageEventPtr event,
     DispatchExtendableMessageEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->message_event_callbacks));
   context_->message_event_callbacks.emplace(request_id, std::move(callback));
@@ -1450,7 +1493,9 @@
         blink::mojom::ExtendableMessageEventPtr event,
         base::TimeDelta timeout,
         DispatchExtendableMessageEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEventWithCustomTimeout(
       CreateAbortCallback(&context_->message_event_callbacks), timeout);
 
@@ -1482,12 +1527,8 @@
     blink::mojom::DispatchFetchEventParamsPtr params,
     blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
     DispatchFetchEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  if (!context_) {
-    CrashWithDebugLog("DFE1");
-    return;
-  }
-  dispatching_fetch_event_ = true;
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_);
   int event_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->fetch_event_callbacks));
   context_->fetch_event_callbacks.emplace(event_id, std::move(callback));
@@ -1513,12 +1554,7 @@
   blink::WebServiceWorkerRequest web_request;
   ToWebServiceWorkerRequestForFetchEvent(std::move(params->request),
                                          params->client_id, &web_request);
-  if (!context_) {
-    CrashWithDebugLog("DFE2");
-    return;
-  }
   proxy_->DispatchFetchEvent(event_id, web_request, navigation_preload_sent);
-  dispatching_fetch_event_ = false;
 }
 
 void ServiceWorkerContextClient::DispatchNotificationClickEvent(
@@ -1527,7 +1563,8 @@
     int action_index,
     const base::Optional<base::string16>& reply,
     DispatchNotificationClickEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->notification_click_event_callbacks));
   context_->notification_click_event_callbacks.emplace(request_id,
@@ -1552,7 +1589,8 @@
     const std::string& notification_id,
     const blink::PlatformNotificationData& notification_data,
     DispatchNotificationCloseEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->notification_close_event_callbacks));
   context_->notification_close_event_callbacks.emplace(request_id,
@@ -1571,7 +1609,9 @@
 void ServiceWorkerContextClient::DispatchPushEvent(
     const base::Optional<std::string>& payload,
     DispatchPushEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEventWithCustomTimeout(
       CreateAbortCallback(&context_->push_event_callbacks),
       base::TimeDelta::FromSeconds(blink::mojom::kPushEventTimeoutSeconds));
@@ -1593,7 +1633,9 @@
     const net::CanonicalCookie& cookie,
     ::network::mojom::CookieChangeCause cause,
     DispatchCookieChangeEventCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
   int request_id = context_->timeout_timer->StartEvent(
       CreateAbortCallback(&context_->cookie_change_event_callbacks));
   context_->cookie_change_event_callbacks.emplace(request_id,
@@ -1605,7 +1647,7 @@
       TRACE_EVENT_FLAG_FLOW_OUT);
 
   // After onion-souping, the conversion below will be done by mojo directly.
-  CHECK(!cookie.IsHttpOnly());
+  DCHECK(!cookie.IsHttpOnly());
   base::Optional<blink::WebCanonicalCookie> web_cookie_opt =
       blink::WebCanonicalCookie::Create(
           blink::WebString::FromUTF8(cookie.Name()),
@@ -1616,20 +1658,21 @@
           false /* cookie.IsHttpOnly() */,
           static_cast<network::mojom::CookieSameSite>(cookie.SameSite()),
           static_cast<network::mojom::CookiePriority>(cookie.Priority()));
-  CHECK(web_cookie_opt.has_value());
+  DCHECK(web_cookie_opt.has_value());
 
   proxy_->DispatchCookieChangeEvent(request_id, web_cookie_opt.value(), cause);
 }
 
 void ServiceWorkerContextClient::Ping(PingCallback callback) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
   std::move(callback).Run();
 }
 
 void ServiceWorkerContextClient::SetIdleTimerDelayToZero() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
+  DCHECK(context_->timeout_timer);
   context_->timeout_timer->SetIdleTimerDelayToZero();
 }
 
@@ -1637,7 +1680,9 @@
     int fetch_event_id,
     const GURL& url,
     blink::mojom::FetchEventPreloadHandlePtr preload_handle) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because it's valid in our callsite.
+  DCHECK(context_);
   auto preload_request = std::make_unique<NavigationPreloadRequest>(
       GetWeakPtr(), fetch_event_id, url, std::move(preload_handle));
   context_->preload_requests.AddWithID(std::move(preload_request),
@@ -1645,11 +1690,12 @@
 }
 
 void ServiceWorkerContextClient::OnIdleTimeout() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because this is called by a timer owned by |context_|.
+  DCHECK(context_);
   // RequestedTermination() returns true if ServiceWorkerTimeoutTimer agrees
   // we should request the host to terminate this worker now.
-  CHECK(RequestedTermination());
-  RecordDebugLog("OnIdleTimeout");
+  DCHECK(RequestedTermination());
   (*instance_host_)
       ->RequestTermination(base::BindOnce(
           &ServiceWorkerContextClient::OnRequestedTermination, GetWeakPtr()));
@@ -1657,11 +1703,10 @@
 
 void ServiceWorkerContextClient::OnRequestedTermination(
     bool will_be_terminated) {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
-  RecordDebugLog(will_be_terminated ? "OnRequestedTermination/Y"
-                                    : "OnRequestedTermination/N");
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because the Mojo binding is on |worker_task_runner_|.
+  DCHECK(context_);
+  DCHECK(context_->timeout_timer);
 
   // This worker will be terminated soon. Ignore the message.
   if (will_be_terminated)
@@ -1674,55 +1719,36 @@
 }
 
 bool ServiceWorkerContextClient::RequestedTermination() const {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
-  CHECK(context_->timeout_timer);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  // |context_| is valid because it's valid at our callsites.
+  DCHECK(context_);
+  DCHECK(context_->timeout_timer);
   return context_->timeout_timer->did_idle_timeout();
 }
 
 void ServiceWorkerContextClient::StopWorkerOnMainThread() {
-  RecordDebugLog("StopWorker");
-  CHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(main_thread_task_runner_->RunsTasksInCurrentSequence());
   owner_->StopWorker();
 }
 
 base::WeakPtr<ServiceWorkerContextClient>
 ServiceWorkerContextClient::GetWeakPtr() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_);
   return context_->weak_factory.GetWeakPtr();
 }
 
 void ServiceWorkerContextClient::SetTimeoutTimerForTesting(
     std::unique_ptr<ServiceWorkerTimeoutTimer> timeout_timer) {
-  CHECK(context_);
+  DCHECK(context_);
   context_->timeout_timer = std::move(timeout_timer);
 }
 
 ServiceWorkerTimeoutTimer*
 ServiceWorkerContextClient::GetTimeoutTimerForTesting() {
-  CHECK(worker_task_runner_->RunsTasksInCurrentSequence());
-  CHECK(context_);
+  DCHECK(worker_task_runner_->RunsTasksInCurrentSequence());
+  DCHECK(context_);
   return context_->timeout_timer.get();
 }
 
-void ServiceWorkerContextClient::RecordDebugLog(const char* message) {
-  const size_t kMaxDebugLogSize = 512;
-  base::AutoLock lock(debug_log_lock_);
-  debug_log_.emplace_back(message);
-  if (debug_log_.size() > kMaxDebugLogSize)
-    debug_log_.pop_front();
-}
-
-void ServiceWorkerContextClient::CrashWithDebugLog(const std::string& reason) {
-  base::AutoLock lock(debug_log_lock_);
-  std::string log;
-  for (const auto& entry : debug_log_) {
-    log += entry + " ";
-  }
-  DEBUG_ALIAS_FOR_CSTR(debug_log, log.c_str(), 1024);
-  DEBUG_ALIAS_FOR_CSTR(reason_log, reason.c_str(), 32);
-  CHECK(false);
-}
-
 }  // namespace content
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 53b6244..5cd057d 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -8,7 +8,6 @@
 #include <stddef.h>
 #include <stdint.h>
 
-#include <deque>
 #include <map>
 #include <memory>
 #include <string>
@@ -18,7 +17,6 @@
 #include "base/macros.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/strings/string16.h"
-#include "base/synchronization/lock.h"
 #include "base/time/time.h"
 #include "content/common/service_worker/service_worker_types.h"
 #include "ipc/ipc_listener.h"
@@ -210,11 +208,6 @@
       blink::mojom::ServiceWorkerFetchResponseCallbackPtr response_callback,
       DispatchFetchEventCallback callback);
 
-  // TODO(crbug.com/907311): Remove after we identified the cause of crash.
-  void SetReportDebugLogForTesting(bool report_debug_log) {
-    report_debug_log_ = report_debug_log;
-  }
-
   /////////////////////////////////////////////////////////////////////////////
   // The following are for use by NavigationPreloadRequest.
   //
@@ -369,13 +362,6 @@
       std::unique_ptr<ServiceWorkerTimeoutTimer> timeout_timer);
   ServiceWorkerTimeoutTimer* GetTimeoutTimerForTesting();
 
-  // TODO(crbug.com/907311): Remove after we identified the cause of crash.
-  // Guarded by the lock because these are called from both the main thread
-  // and the worker thread.
-  void RecordDebugLog(const char* message) LOCKS_EXCLUDED(debug_log_lock_);
-  void CrashWithDebugLog(const std::string& reason)
-      LOCKS_EXCLUDED(debug_log_lock_);
-
   const int64_t service_worker_version_id_;
   const GURL service_worker_scope_;
   const GURL script_url_;
@@ -414,8 +400,16 @@
 
   blink::mojom::BlobRegistryPtr blob_registry_;
 
-  // Initialized on the worker thread in workerContextStarted and
-  // destructed on the worker thread in willDestroyWorkerContext.
+  // Initialized on the worker thread in WorkerContextStarted and
+  // destructed on the worker thread in WillDestroyWorkerContext.
+  //
+  // WARNING: This can be cleared at nearly any time, since WillDestroyContext
+  // is called by Blink when it decides to terminate the worker thread. This
+  // includes during event dispatch if a JavaScript debugger breakpoint pauses
+  // execution (see issue 934622). It should be safe to assume |context_| is
+  // valid at the start of a task that was posted to |worker_task_runner_|, as
+  // that is from WorkerThread::GetTaskRunner() which safely drops the task on
+  // worker termination.
   std::unique_ptr<WorkerContextData> context_;
 
   // Accessed on the worker thread. Passed to the browser process after worker
@@ -431,12 +425,6 @@
   network::mojom::URLLoaderFactoryPtr
       network_service_connection_error_handler_holder_;
 
-  // TODO(crbug.com/907311): Remove after we identified the cause of crash.
-  bool report_debug_log_ = true;
-  base::Lock debug_log_lock_;
-  std::deque<std::string> debug_log_ GUARDED_BY(debug_log_lock_);
-  bool dispatching_fetch_event_ = false;
-
   DISALLOW_COPY_AND_ASSIGN(ServiceWorkerContextClient);
 };
 
diff --git a/content/renderer/service_worker/service_worker_context_client_unittest.cc b/content/renderer/service_worker/service_worker_context_client_unittest.cc
index 319df286b..d450a51c 100644
--- a/content/renderer/service_worker/service_worker_context_client_unittest.cc
+++ b/content/renderer/service_worker/service_worker_context_client_unittest.cc
@@ -323,7 +323,6 @@
         nullptr /* subresource_loaders */,
         blink::scheduler::GetSingleThreadTaskRunnerForTesting());
     auto* context_client_raw = context_client.get();
-    context_client->SetReportDebugLogForTesting(false);
 
     embedded_worker_instance_client->worker_ =
         std::make_unique<FakeWebEmbeddedWorker>(std::move(context_client));
diff --git a/content/renderer/service_worker/service_worker_timeout_timer.cc b/content/renderer/service_worker/service_worker_timeout_timer.cc
index 65ea52eb..76293d25 100644
--- a/content/renderer/service_worker/service_worker_timeout_timer.cc
+++ b/content/renderer/service_worker/service_worker_timeout_timer.cc
@@ -33,7 +33,7 @@
 ServiceWorkerTimeoutTimer::StayAwakeToken::StayAwakeToken(
     base::WeakPtr<ServiceWorkerTimeoutTimer> timer)
     : timer_(std::move(timer)) {
-  CHECK(timer_);
+  DCHECK(timer_);
   timer_->num_of_stay_awake_tokens_++;
 }
 
@@ -71,7 +71,7 @@
 }
 
 void ServiceWorkerTimeoutTimer::Start() {
-  CHECK(!timer_.IsRunning());
+  DCHECK(!timer_.IsRunning());
   // |idle_callback_| will be invoked if no event happens in |kIdleDelay|.
   if (!HasInflightEvent() && idle_time_.is_null())
     idle_time_ = tick_clock_->NowTicks() + kIdleDelay;
@@ -88,7 +88,7 @@
     AbortCallback abort_callback,
     base::TimeDelta timeout) {
   if (did_idle_timeout()) {
-    CHECK(!running_pending_tasks_);
+    DCHECK(!running_pending_tasks_);
     idle_time_ = base::TimeTicks();
     did_idle_timeout_ = false;
 
@@ -107,13 +107,13 @@
   std::tie(iter, is_inserted) = inflight_events_.emplace(
       event_id, tick_clock_->NowTicks() + timeout,
       base::BindOnce(std::move(abort_callback), event_id));
-  CHECK(is_inserted);
+  DCHECK(is_inserted);
   id_event_map_.emplace(event_id, iter);
   return event_id;
 }
 
 void ServiceWorkerTimeoutTimer::EndEvent(int event_id) {
-  CHECK(HasEvent(event_id));
+  DCHECK(HasEvent(event_id));
 
   auto iter = id_event_map_.find(event_id);
   inflight_events_.erase(iter->second);
@@ -135,7 +135,7 @@
 
 void ServiceWorkerTimeoutTimer::PushPendingTask(
     base::OnceClosure pending_task) {
-  CHECK(did_idle_timeout());
+  DCHECK(did_idle_timeout());
   pending_tasks_.emplace(std::move(pending_task));
 }
 
@@ -176,7 +176,7 @@
 }
 
 bool ServiceWorkerTimeoutTimer::MaybeTriggerIdleTimer() {
-  CHECK(!HasInflightEvent());
+  DCHECK(!HasInflightEvent());
   if (!zero_idle_timer_delay_)
     return false;
 
@@ -186,7 +186,7 @@
 }
 
 void ServiceWorkerTimeoutTimer::OnNoInflightEvent() {
-  CHECK(!HasInflightEvent());
+  DCHECK(!HasInflightEvent());
   idle_time_ = tick_clock_->NowTicks() + kIdleDelay;
   MaybeTriggerIdleTimer();
 }
diff --git a/content/shell/renderer/web_test/blink_test_runner.cc b/content/shell/renderer/web_test/blink_test_runner.cc
index 9b92dd3..d0cf619 100644
--- a/content/shell/renderer/web_test/blink_test_runner.cc
+++ b/content/shell/renderer/web_test/blink_test_runner.cc
@@ -526,8 +526,9 @@
   waiting_for_pixels_dump_result_ = true;
   bool browser_should_capture_pixels =
       interfaces->TestRunner()->DumpPixelsAsync(
-          render_view(), base::BindOnce(&BlinkTestRunner::OnPixelsDumpCompleted,
-                                        base::Unretained(this)));
+          render_view()->GetWebView()->MainFrame()->ToWebLocalFrame(),
+          base::BindOnce(&BlinkTestRunner::OnPixelsDumpCompleted,
+                         base::Unretained(this)));
 
   // If the browser should capture pixels, then we shouldn't be waiting for dump
   // results.
diff --git a/content/shell/test_runner/test_runner.cc b/content/shell/test_runner/test_runner.cc
index 13d8fdc..f39aaea 100644
--- a/content/shell/test_runner/test_runner.cc
+++ b/content/shell/test_runner/test_runner.cc
@@ -1663,11 +1663,8 @@
 }
 
 bool TestRunner::DumpPixelsAsync(
-    content::RenderView* render_view,
+    blink::WebLocalFrame* frame,
     base::OnceCallback<void(const SkBitmap&)> callback) {
-  auto* view_proxy = static_cast<WebViewTestProxy*>(render_view);
-  CHECK(view_proxy->GetWebView()->MainFrame());
-
   if (web_test_runtime_flags_.dump_drag_image()) {
     if (drag_image_.isNull()) {
       // This means the test called dumpDragImage but did not initiate a drag.
@@ -1686,27 +1683,22 @@
   // If we need to do a display compositor pixel dump, then delegate that to the
   // browser by returning true. Note that printing case can be handled here.
   if (!web_test_runtime_flags_.is_printing()) {
-    auto* widget_proxy =
-        static_cast<WebWidgetTestProxy*>(view_proxy->GetWidget());
-    widget_proxy->RequestCompositeAndPresentation(base::BindOnce(
-        [](base::OnceCallback<void(const SkBitmap&)> callback,
-           const gfx::PresentationFeedback& feedback) {
-          // Generate a 1x1 black bitmap.
-          SkBitmap bitmap;
-          bitmap.allocN32Pixels(1, 1);
-          bitmap.eraseColor(0);
-          std::move(callback).Run(bitmap);
-        },
-        std::move(callback)));
+    frame->View()->MainFrameWidget()->RequestPresentationCallbackForTesting(
+        base::BindOnce(
+            [](base::OnceCallback<void(const SkBitmap&)> callback) {
+              SkBitmap bitmap;
+              bitmap.allocN32Pixels(1, 1);
+              bitmap.eraseColor(0);
+              std::move(callback).Run(bitmap);
+            },
+            std::move(callback)));
     return true;
   }
 
-  blink::WebLocalFrame* frame =
-      view_proxy->GetWebView()->MainFrame()->ToWebLocalFrame();
-  blink::WebLocalFrame* target_frame = frame;
+  auto* target_frame = frame;
   std::string frame_name = web_test_runtime_flags_.printing_frame();
   if (!frame_name.empty()) {
-    blink::WebFrame* frame_to_print =
+    auto* frame_to_print =
         frame->FindFrameByName(blink::WebString::FromUTF8(frame_name));
     if (frame_to_print && frame_to_print->IsWebLocalFrame())
       target_frame = frame_to_print->ToWebLocalFrame();
diff --git a/content/shell/test_runner/test_runner.h b/content/shell/test_runner/test_runner.h
index fdea070..49f1bd3a 100644
--- a/content/shell/test_runner/test_runner.h
+++ b/content/shell/test_runner/test_runner.h
@@ -41,6 +41,7 @@
 }
 
 namespace test_runner {
+
 class MockContentSettingsClient;
 class MockScreenOrientationClient;
 class SpellCheckClient;
@@ -87,7 +88,7 @@
   std::string DumpLayout(blink::WebLocalFrame* frame) override;
   bool ShouldDumpSelectionRect() const override;
   bool DumpPixelsAsync(
-      content::RenderView* render_view,
+      blink::WebLocalFrame* frame,
       base::OnceCallback<void(const SkBitmap&)> callback) override;
   void ReplicateWebTestRuntimeFlagsChanges(
       const base::DictionaryValue& changed_values) override;
diff --git a/content/shell/test_runner/test_runner_for_specific_view.cc b/content/shell/test_runner/test_runner_for_specific_view.cc
index 0308305..2a36e84 100644
--- a/content/shell/test_runner/test_runner_for_specific_view.cc
+++ b/content/shell/test_runner/test_runner_for_specific_view.cc
@@ -227,7 +227,7 @@
       << "testRuner.capturePixelsAsyncThen from an OOPIF";
 
   web_view_test_proxy_->test_interfaces()->GetTestRunner()->DumpPixelsAsync(
-      web_view_test_proxy_,
+      web_view()->MainFrame()->ToWebLocalFrame(),
       base::BindOnce(&TestRunnerForSpecificView::CapturePixelsCallback,
                      weak_factory_.GetWeakPtr(),
                      std::move(persistent_callback)));
diff --git a/content/shell/test_runner/web_test_runner.h b/content/shell/test_runner/web_test_runner.h
index 86c1a81..bbf2f2c 100644
--- a/content/shell/test_runner/web_test_runner.h
+++ b/content/shell/test_runner/web_test_runner.h
@@ -23,10 +23,6 @@
 class WebView;
 }
 
-namespace content {
-class RenderView;
-}
-
 namespace test_runner {
 
 class WebTestRunner {
@@ -60,15 +56,13 @@
   // pixels.
   virtual bool ShouldDumpSelectionRect() const = 0;
 
-  // Snapshots the content of |render_view| using the mode requested by the
-  // current test and calls |callback| with the result.  Caller needs to ensure
-  // that |render_view| stays alive until |callback| is called.
+  // Snapshots image of |web_view| using the mode requested by the current test
+  // and calls |callback| with the result.  Caller needs to ensure that
+  // |web_view| stays alive until |callback| is called.
   // Returns false if the request to capture pixels was processed locally, and
-  // true if the pixels need to be captured in the browser process instead. In
-  // that case the |callback| is still called once the pixels are captures but
-  // the SkBitmap contained within is not useful.
+  // true if the pixels need to be captured in the browser process instead..
   virtual bool DumpPixelsAsync(
-      content::RenderView* render_view,
+      blink::WebLocalFrame* frame,
       base::OnceCallback<void(const SkBitmap&)> callback) = 0;
 
   // Replicates changes to web test runtime flags
diff --git a/content/shell/test_runner/web_widget_test_proxy.cc b/content/shell/test_runner/web_widget_test_proxy.cc
index cf110680..d18921a 100644
--- a/content/shell/test_runner/web_widget_test_proxy.cc
+++ b/content/shell/test_runner/web_widget_test_proxy.cc
@@ -4,7 +4,6 @@
 
 #include "content/shell/test_runner/web_widget_test_proxy.h"
 
-#include "content/renderer/compositor/compositor_dependencies.h"
 #include "content/renderer/compositor/layer_tree_view.h"
 #include "content/renderer/input/widget_input_handler_manager.h"
 #include "content/shell/test_runner/test_interfaces.h"
@@ -22,17 +21,6 @@
 
 WebWidgetTestProxy::~WebWidgetTestProxy() = default;
 
-void WebWidgetTestProxy::RequestCompositeAndPresentation(
-    PresentationTimeCallback callback) {
-  // Request the |callback| in the next main frame, and schedule the commit.
-  RenderWidget::RequestPresentation(std::move(callback));
-  // RequestPresentation() will ScheduleAnimation(), but in this case we want to
-  // ensure the compositor is actually run, rather than just doing the main
-  // frame animate step. That way we know it will submit a frame and later
-  // trigger the presentation callback in order to make progress in the test.
-  composite_requested_ = true;
-}
-
 void WebWidgetTestProxy::ScheduleAnimation() {
   if (!GetTestRunner()->TestIsRunning())
     return;
@@ -43,14 +31,13 @@
   // Note that for WebWidgetTestProxy the RenderWidget is subclassed to override
   // the WebWidgetClient, so we must call up to the base class RenderWidget
   // explicitly here to jump out of the test harness as intended.
-  if (RenderWidget::compositor_deps()->GetCompositorImplThreadTaskRunner()) {
+  if (!RenderWidget::layer_tree_view()->CompositeIsSynchronousForTesting()) {
     RenderWidget::ScheduleAnimation();
     return;
   }
 
   if (!animation_scheduled_) {
     animation_scheduled_ = true;
-    composite_requested_ |= GetTestRunner()->animation_requires_raster();
     GetWebViewTestProxy()->delegate()->PostDelayedTask(
         base::BindOnce(&WebWidgetTestProxy::AnimateNow,
                        weak_factory_.GetWeakPtr()),
@@ -123,41 +110,8 @@
   widget_input_handler_manager()->InvokeInputProcessedCallback();
 }
 
-TestRunnerForSpecificView* WebWidgetTestProxy::GetViewTestRunner() {
-  return GetWebViewTestProxy()->view_test_runner();
-}
-
-TestRunner* WebWidgetTestProxy::GetTestRunner() {
-  return GetWebViewTestProxy()->test_interfaces()->GetTestRunner();
-}
-
-static void DoComposite(content::RenderWidget* widget, bool do_raster) {
-  if (widget->in_synchronous_composite_for_testing()) {
-    // Web tests can use a nested message loop to pump frames while inside a
-    // frame, but the compositor does not support this. In this case, we only
-    // run blink's lifecycle updates.
-    widget->BeginMainFrame(base::TimeTicks::Now());
-    widget->UpdateVisualState();
-    return;
-  }
-
-  widget->set_in_synchronous_composite_for_testing(true);
-  widget->layer_tree_view()->layer_tree_host()->Composite(
-      base::TimeTicks::Now(), do_raster);
-  widget->set_in_synchronous_composite_for_testing(false);
-}
-
 void WebWidgetTestProxy::SynchronouslyComposite(bool do_raster) {
-  DCHECK(!compositor_deps()->GetCompositorImplThreadTaskRunner());
-  DCHECK(!layer_tree_view()
-              ->layer_tree_host()
-              ->GetSettings()
-              .single_thread_proxy_scheduler);
-
-  if (!layer_tree_view()->layer_tree_host()->IsVisible())
-    return;
-
-  DoComposite(this, do_raster);
+  layer_tree_view()->SynchronouslyComposite(do_raster);
 
   // If the RenderWidget is for the main frame, we also composite the current
   // PagePopup afterward.
@@ -170,12 +124,23 @@
     if (blink::WebPagePopup* popup = view->GetPagePopup()) {
       auto* popup_render_widget =
           static_cast<RenderWidget*>(popup->GetClientForTesting());
-      DoComposite(popup_render_widget, do_raster);
+      popup_render_widget->layer_tree_view()->SynchronouslyComposite(do_raster);
     }
   }
 }
 
+TestRunnerForSpecificView* WebWidgetTestProxy::GetViewTestRunner() {
+  return GetWebViewTestProxy()->view_test_runner();
+}
+
+TestRunner* WebWidgetTestProxy::GetTestRunner() {
+  return GetWebViewTestProxy()->test_interfaces()->GetTestRunner();
+}
+
 void WebWidgetTestProxy::AnimateNow() {
+  if (!animation_scheduled_)
+    return;
+
   // For child local roots, it's possible that the backing WebWidget gets
   // closed between the ScheduleAnimation() call and this execution
   // leading to a nullptr.  This happens because child local roots are
@@ -191,10 +156,10 @@
   if (!GetWebWidget())
     return;
 
-  bool do_raster = composite_requested_;
   animation_scheduled_ = false;
-  composite_requested_ = false;
-  SynchronouslyComposite(do_raster);
+  CHECK(GetTestRunner());
+  bool animation_requires_raster = GetTestRunner()->animation_requires_raster();
+  SynchronouslyComposite(animation_requires_raster);
 }
 
 }  // namespace test_runner
diff --git a/content/shell/test_runner/web_widget_test_proxy.h b/content/shell/test_runner/web_widget_test_proxy.h
index c3ee39e6..9fef1da8 100644
--- a/content/shell/test_runner/web_widget_test_proxy.h
+++ b/content/shell/test_runner/web_widget_test_proxy.h
@@ -82,13 +82,6 @@
 
   void EndSyntheticGestures();
 
-  // Triggers a full composite, and always submits a new frame to the display
-  // compositor. The |callback| will be run when the display compositor has
-  // presented that frame as part of its global scene.
-  void RequestCompositeAndPresentation(PresentationTimeCallback callback);
-  // When |do_raster| is false, only a main frame animation step is performed,
-  // but when true, a full composite is performed and a frame submitted to the
-  // display compositor if there is any damage.
   void SynchronouslyComposite(bool do_raster);
 
  private:
@@ -104,12 +97,6 @@
 
   // For collapsing multiple simulated ScheduleAnimation() calls.
   bool animation_scheduled_ = false;
-  // When true, the scheduled AnimateNow() will perform a full composite.
-  // Otherwise, it will only perform the animation step, which calls out to
-  // blink, for performance reasons. See setAnimationRequiresRaster() in
-  // https://chromium.googlesource.com/chromium/src/+/master/docs/testing/writing_web_tests.md
-  // for details on the optimization.
-  bool composite_requested_ = false;
 
   base::WeakPtrFactory<WebWidgetTestProxy> weak_factory_{this};
 
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 1b2ee905..f9712dd 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1968,6 +1968,7 @@
     "//media/capture",
     "//media/midi:midi",
     "//media/midi:mojo",
+    "//media/webrtc",
     "//mojo/core/embedder",
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/test_support:test_utils",
diff --git a/content/test/data/accessibility/event/document-title-change.html b/content/test/data/accessibility/event/document-title-change.html
new file mode 100644
index 0000000..e8035f3
--- /dev/null
+++ b/content/test/data/accessibility/event/document-title-change.html
@@ -0,0 +1,12 @@
+<html>
+    <head>
+            <title>Before</title>
+    </head>
+    <body>
+        <script type="application/javascript">
+            function go() {
+                document.title = "After"
+            }
+        </script>
+    </body>
+</html>
\ No newline at end of file
diff --git a/content/test/data/accessibility/event/document-title-changed-expected-auralinux.txt b/content/test/data/accessibility/event/document-title-changed-expected-auralinux.txt
new file mode 100644
index 0000000..aa5361a
--- /dev/null
+++ b/content/test/data/accessibility/event/document-title-changed-expected-auralinux.txt
@@ -0,0 +1 @@
+NAME-CHANGED:After role=ROLE_FRAME name='After' ENABLED,SENSITIVE,SHOWING,VISIBLE
diff --git a/device/vr/windows/compositor_base.cc b/device/vr/windows/compositor_base.cc
index d4e0807..1a714ab0 100644
--- a/device/vr/windows/compositor_base.cc
+++ b/device/vr/windows/compositor_base.cc
@@ -64,6 +64,10 @@
     // frame, we allow the renderer to receive poses.
     std::move(delayed_get_frame_data_callback_).Run();
   }
+
+  if (delayed_overlay_get_frame_data_callback_ && overlay_visible_) {
+    std::move(delayed_overlay_get_frame_data_callback_).Run();
+  }
 }
 
 void XRCompositorCommon::SubmitFrameMissing(int16_t frame_index,
@@ -246,6 +250,7 @@
 
   // Kill outstanding overlays:
   overlay_visible_ = false;
+  delayed_overlay_get_frame_data_callback_.Reset();
   overlay_binding_.Close();
 
   texture_helper_.SetSourceAndOverlayVisible(false, false);
@@ -397,6 +402,16 @@
   DCHECK(overlay_visible_);
   TRACE_EVENT_INSTANT0("xr", "RequestOverlayPose", TRACE_EVENT_SCOPE_THREAD);
 
+  // If we've already given out a pose for the current frame delay giving out a
+  // pose until the next frame we are visible.
+  if (pending_frame_ && pending_frame_->overlay_has_pose_) {
+    DCHECK(!delayed_overlay_get_frame_data_callback_);
+    delayed_overlay_get_frame_data_callback_ =
+        base::BindOnce(&XRCompositorCommon::RequestNextOverlayPose,
+                       base::Unretained(this), std::move(callback));
+    return;
+  }
+
   // Ensure we have a pending frame.
   StartPendingFrame();
   pending_frame_->overlay_has_pose_ = true;
diff --git a/device/vr/windows/compositor_base.h b/device/vr/windows/compositor_base.h
index e19a071b..49fa920 100644
--- a/device/vr/windows/compositor_base.h
+++ b/device/vr/windows/compositor_base.h
@@ -150,6 +150,7 @@
   bool webxr_visible_ = true;   // The browser may hide a presenting session.
   bool overlay_visible_ = false;
   base::OnceCallback<void()> delayed_get_frame_data_callback_;
+  base::OnceCallback<void()> delayed_overlay_get_frame_data_callback_;
 
   gfx::RectF left_webxr_bounds_;
   gfx::RectF right_webxr_bounds_;
diff --git a/extensions/browser/api/web_request/web_request_proxying_websocket.cc b/extensions/browser/api/web_request/web_request_proxying_websocket.cc
index 4a9255e4..d630a42 100644
--- a/extensions/browser/api/web_request/web_request_proxying_websocket.cc
+++ b/extensions/browser/api/web_request/web_request_proxying_websocket.cc
@@ -44,10 +44,12 @@
   binding_as_websocket_.Bind(std::move(proxied_request));
   binding_as_auth_handler_.Bind(std::move(auth_request));
 
-  binding_as_websocket_.set_connection_error_handler(base::BindOnce(
-      &WebRequestProxyingWebSocket::OnMojoError, base::Unretained(this)));
-  binding_as_auth_handler_.set_connection_error_handler(base::BindOnce(
-      &WebRequestProxyingWebSocket::OnMojoError, base::Unretained(this)));
+  binding_as_websocket_.set_connection_error_handler(
+      base::BindRepeating(&WebRequestProxyingWebSocket::OnError,
+                          base::Unretained(this), net::ERR_FAILED));
+  binding_as_auth_handler_.set_connection_error_handler(
+      base::BindRepeating(&WebRequestProxyingWebSocket::OnError,
+                          base::Unretained(this), net::ERR_FAILED));
 
   if (header_client_request)
     binding_as_header_client_.Bind(std::move(header_client_request));
@@ -120,7 +122,7 @@
   DCHECK(!should_collapse_initiator);
 
   if (result == net::ERR_BLOCKED_BY_CLIENT) {
-    HandleErrorDuringHandshake(result);
+    OnError(result);
     return;
   }
 
@@ -162,8 +164,7 @@
     rv = net::ERR_ABORTED;
   }
 
-  DoErrorOccurredIfNeeded(rv);
-  // Wait for the render process to delete us to avoid race conditions.
+  OnError(rv);
 }
 
 void WebRequestProxyingWebSocket::OnStartOpeningHandshake(
@@ -174,11 +175,6 @@
 
 void WebRequestProxyingWebSocket::OnFinishOpeningHandshake(
     network::mojom::WebSocketHandshakeResponsePtr response) {
-  if (is_handshake_done_) {
-    LOG(WARNING) << "Network service called OnFinishOpeningHandshake too late";
-    return;
-  }
-
   DCHECK(forwarding_client_);
 
   // response_.headers will be set in OnBeforeSendHeaders if
@@ -217,7 +213,7 @@
       response_.headers.get(), &override_headers_, &redirect_url_);
 
   if (result == net::ERR_BLOCKED_BY_CLIENT) {
-    HandleErrorDuringHandshake(result);
+    OnError(result);
     return;
   }
 
@@ -233,13 +229,8 @@
     const std::string& selected_protocol,
     const std::string& extensions) {
   DCHECK(forwarding_client_);
-  if (is_handshake_done_) {
-    DLOG(WARNING)
-        << "Multiple OnAddChannelResponse messages from network service";
-    return;
-  }
-  is_handshake_done_ = true;
-
+  DCHECK(!is_done_);
+  is_done_ = true;
   ExtensionWebRequestEventRouter::GetInstance()->OnCompleted(
       browser_context_, info_map_, &info_.value(), net::ERR_WS_UPGRADE);
 
@@ -266,7 +257,7 @@
   forwarding_client_->OnDropChannel(was_clean, code, reason);
 
   forwarding_client_ = nullptr;
-  // Wait for the render process to delete us to do cleanup.
+  OnError(net::ERR_FAILED);
 }
 
 void WebRequestProxyingWebSocket::OnClosingHandshake() {
@@ -279,13 +270,8 @@
     const scoped_refptr<net::HttpResponseHeaders>& headers,
     const net::IPEndPoint& remote_endpoint,
     OnAuthRequiredCallback callback) {
-  if (is_handshake_done_) {
-    LOG(WARNING) << "Unexpected call to OnAuthRequired from network service";
-    return;
-  }
-
   if (!auth_info || !callback) {
-    HandleErrorDuringHandshake(net::ERR_FAILED);
+    OnError(net::ERR_FAILED);
     return;
   }
 
@@ -301,7 +287,7 @@
       response_.headers.get(), &override_headers_, &redirect_url_);
 
   if (result == net::ERR_BLOCKED_BY_CLIENT) {
-    HandleErrorDuringHandshake(result);
+    OnError(result);
     return;
   }
 
@@ -371,7 +357,7 @@
   DCHECK(binding_as_header_client_ || !binding_as_client_.is_bound());
   DCHECK(request_.url.SchemeIsWSOrWSS());
   if (error_code != net::OK) {
-    HandleErrorDuringHandshake(error_code);
+    OnError(error_code);
     return;
   }
 
@@ -385,7 +371,7 @@
           &request_.headers);
 
   if (result == net::ERR_BLOCKED_BY_CLIENT) {
-    HandleErrorDuringHandshake(result);
+    OnError(result);
     return;
   }
 
@@ -399,7 +385,7 @@
 void WebRequestProxyingWebSocket::OnBeforeSendHeadersComplete(int error_code) {
   DCHECK(binding_as_header_client_ || !binding_as_client_.is_bound());
   if (error_code != net::OK) {
-    HandleErrorDuringHandshake(error_code);
+    OnError(error_code);
     return;
   }
 
@@ -426,8 +412,9 @@
   }
 
   binding_as_client_.Bind(mojo::MakeRequest(&proxy));
-  binding_as_client_.set_connection_error_handler(base::BindOnce(
-      &WebRequestProxyingWebSocket::OnMojoError, base::Unretained(this)));
+  binding_as_client_.set_connection_error_handler(
+      base::BindOnce(&WebRequestProxyingWebSocket::OnError,
+                     base::Unretained(this), net::ERR_FAILED));
   proxied_socket_->AddChannelRequest(
       request_.url, websocket_protocols_, request_.site_for_cookies,
       std::move(additional_headers), std::move(proxy));
@@ -435,7 +422,7 @@
 
 void WebRequestProxyingWebSocket::OnHeadersReceivedComplete(int error_code) {
   if (error_code != net::OK) {
-    HandleErrorDuringHandshake(error_code);
+    OnError(error_code);
     return;
   }
 
@@ -480,7 +467,7 @@
     scoped_refptr<net::AuthChallengeInfo> auth_info,
     int rv) {
   if (rv != net::OK) {
-    HandleErrorDuringHandshake(rv);
+    OnError(rv);
     return;
   }
   ResumeIncomingMethodCallProcessing();
@@ -513,26 +500,13 @@
     binding_as_header_client_.ResumeIncomingMethodCallProcessing();
 }
 
-void WebRequestProxyingWebSocket::DoErrorOccurredIfNeeded(int error_code) {
-  if (!is_handshake_done_ && info_.has_value()) {
-    is_handshake_done_ = true;
+void WebRequestProxyingWebSocket::OnError(int error_code) {
+  if (!is_done_ && info_.has_value()) {
+    is_done_ = true;
     ExtensionWebRequestEventRouter::GetInstance()->OnErrorOccurred(
         browser_context_, info_map_, &info_.value(), true /* started */,
         error_code);
   }
-}
-
-void WebRequestProxyingWebSocket::OnMojoError() {
-  HandleGenericError(net::ERR_FAILED);
-}
-
-void WebRequestProxyingWebSocket::HandleErrorDuringHandshake(int error_code) {
-  DCHECK(!is_handshake_done_);
-  HandleGenericError(error_code);
-}
-
-void WebRequestProxyingWebSocket::HandleGenericError(int error_code) {
-  DoErrorOccurredIfNeeded(error_code);
   if (forwarding_client_)
     forwarding_client_->OnFailChannel(net::ErrorToString(error_code));
 
diff --git a/extensions/browser/api/web_request/web_request_proxying_websocket.h b/extensions/browser/api/web_request/web_request_proxying_websocket.h
index 3251fdd..cac917d 100644
--- a/extensions/browser/api/web_request/web_request_proxying_websocket.h
+++ b/extensions/browser/api/web_request/web_request_proxying_websocket.h
@@ -123,10 +123,7 @@
 
   void PauseIncomingMethodCallProcessing();
   void ResumeIncomingMethodCallProcessing();
-  void DoErrorOccurredIfNeeded(int error_code);
-  void OnMojoError();
-  void HandleErrorDuringHandshake(int error_code);
-  void HandleGenericError(int error_code);
+  void OnError(int result);
 
   const int process_id_;
   const int render_frame_id_;
@@ -153,7 +150,7 @@
   OnHeadersReceivedCallback on_headers_received_callback_;
 
   GURL redirect_url_;
-  bool is_handshake_done_ = false;
+  bool is_done_ = false;
   bool waiting_for_header_client_headers_received_ = false;
 
   base::Optional<WebRequestInfo> info_;
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc
index 5461b50..342885b 100644
--- a/extensions/browser/extension_prefs.cc
+++ b/extensions/browser/extension_prefs.cc
@@ -1840,7 +1840,7 @@
   registry->RegisterListPref(pref_names::kInstallAllowList);
   registry->RegisterListPref(pref_names::kInstallDenyList);
   registry->RegisterDictionaryPref(pref_names::kInstallForceList);
-  registry->RegisterDictionaryPref(pref_names::kInstallLoginScreenAppList);
+  registry->RegisterDictionaryPref(pref_names::kLoginScreenExtensions);
   registry->RegisterListPref(pref_names::kAllowedTypes);
   registry->RegisterBooleanPref(pref_names::kStorageGarbageCollect, false);
   registry->RegisterListPref(pref_names::kAllowedInstallSites);
diff --git a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
index 4b8e626..d5defb6 100644
--- a/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
+++ b/extensions/browser/guest_view/mime_handler_view/mime_handler_view_browsertest.cc
@@ -218,13 +218,8 @@
 // to load a MimeHandlerView. The test passes if MHV loads. This is to catch the
 // potential race between the cross-origin renderer initiated navigation and
 // the navigation to "about:blank" started from the browser.
-#if defined(OS_LINUX)
-#define MAYBE_NavigationRaceFromEmbedder DISABLED_NavigationRaceFromEmbedder
-#else
-#define MAYBE_NavigationRaceFromEmbedder NavigationRaceFromEmbedder
-#endif
 IN_PROC_BROWSER_TEST_P(MimeHandlerViewCrossProcessTest,
-                       MAYBE_NavigationRaceFromEmbedder) {
+                       NavigationRaceFromEmbedder) {
   if (!is_cross_process_mode()) {
     // Note that this test would pass trivially with BrowserPlugin-based guests
     // because loading a plugin is quite independent from navigating a plugin.
diff --git a/extensions/browser/pref_names.cc b/extensions/browser/pref_names.cc
index d1a4513..a6dc437 100644
--- a/extensions/browser/pref_names.cc
+++ b/extensions/browser/pref_names.cc
@@ -40,8 +40,8 @@
 const char kInstallAllowList[] = "extensions.install.allowlist";
 const char kInstallDenyList[] = "extensions.install.denylist";
 const char kInstallForceList[] = "extensions.install.forcelist";
-const char kInstallLoginScreenAppList[] =
-    "extensions.install.login_screen_app_list";
+const char kLoginScreenExtensions[] =
+    "extensions.install.login_screen_extensions";
 const char kLastChromeVersion[] = "extensions.last_chrome_version";
 const char kNativeMessagingBlacklist[] = "native_messaging.blacklist";
 const char kNativeMessagingWhitelist[] = "native_messaging.whitelist";
diff --git a/extensions/browser/pref_names.h b/extensions/browser/pref_names.h
index efdada52..80a6e180 100644
--- a/extensions/browser/pref_names.h
+++ b/extensions/browser/pref_names.h
@@ -71,12 +71,12 @@
 // accessed through extensions::ExternalPolicyProvider.
 extern const char kInstallForceList[];
 
-// A list containing apps that Chrome will silently install on the login screen
-// on Chrome OS at startup time. It is a list of strings, each string contains
-// an app ID and an update URL, delimited by a semicolon.
-// This preference is set by an admin policy, and meant to be only
-// accessed through extensions::ExternalPolicyProvider.
-extern const char kInstallLoginScreenAppList[];
+// A list containing apps or extensions that Chrome will silently install on the
+// login screen on Chrome OS at startup time. It is a list of strings, each
+// string contains an app ID and an update URL, delimited by a semicolon. This
+// preference is set by an admin policy, and meant to be only accessed through
+// extensions::ExternalPolicyProvider.
+extern const char kLoginScreenExtensions[];
 
 // String pref for what version chrome was last time the extension prefs were
 // loaded.
diff --git a/extensions/common/api/_api_features.json b/extensions/common/api/_api_features.json
index ae2501b..0b00a92 100644
--- a/extensions/common/api/_api_features.json
+++ b/extensions/common/api/_api_features.json
@@ -224,6 +224,7 @@
         "chrome://media-router/*",
         "chrome://mobilesetup/*",
         "chrome://oobe/*",
+        "chrome://password-change/*",
         "chrome://assistant-optin/*"
       ]
     }
@@ -604,6 +605,7 @@
       "chrome://media-router/*",
       "chrome://mobilesetup/*",
       "chrome://oobe/*",
+      "chrome://password-change/*",
       "chrome://assistant-optin/*"
     ]
   }],
@@ -623,6 +625,7 @@
       "chrome://media-router/*",
       "chrome://mobilesetup/*",
       "chrome://oobe/*",
+      "chrome://password-change/*",
       "chrome://assistant-optin/*"
     ]
   }],
diff --git a/infra/config/luci-milo.cfg b/infra/config/luci-milo.cfg
index 3c64969..fd88dca 100644
--- a/infra/config/luci-milo.cfg
+++ b/infra/config/luci-milo.cfg
@@ -1996,7 +1996,6 @@
     short_name: "asn"
   }
   builders {
-    name: "buildbot/chromium.clang/CrWinAsan(dll)"
     name: "buildbucket/luci.chromium.ci/CrWinAsan(dll)"
     category: "ToT Windows|Asan"
     short_name: "dll"
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 316eeb3..4b00738a 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -161,6 +161,7 @@
     "//components/suggestions",
     "//components/sync",
     "//components/ukm/ios:features",
+    "//components/unified_consent",
     "//components/url_formatter",
     "//components/web_resource",
     "//ios/chrome/app/application_delegate",
diff --git a/ios/chrome/app/DEPS b/ios/chrome/app/DEPS
index 00545b7..d94d5b90 100644
--- a/ios/chrome/app/DEPS
+++ b/ios/chrome/app/DEPS
@@ -21,6 +21,7 @@
   "+components/sync/driver",
   "+components/task_scheduler_util",
   "+components/ukm/ios",
+  "+components/unified_consent",
   "+components/url_formatter",
   "+components/web_resource",
   "+ios/chrome/browser",
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index 8781472..dffc4a4 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -37,6 +37,7 @@
 #include "components/prefs/pref_change_registrar.h"
 #include "components/search_engines/template_url_service.h"
 #include "components/ukm/ios/features.h"
+#include "components/unified_consent/feature.h"
 #include "components/url_formatter/url_formatter.h"
 #include "components/web_resource/web_resource_pref_names.h"
 #import "ios/chrome/app/application_delegate/app_state.h"
@@ -1688,6 +1689,9 @@
 // TODO(crbug.com/779791) : Remove show settings commands from MainController.
 - (void)showSyncSettingsFromViewController:
     (UIViewController*)baseViewController {
+  // When unified consent feather is enabled,
+  // |showGoogleServicesSettingsFromViewController:| should be called.
+  DCHECK(!unified_consent::IsUnifiedConsentFeatureEnabled());
   if (_settingsNavigationController) {
     [_settingsNavigationController
         showSyncSettingsFromViewController:baseViewController];
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 2a5fe0a3..bb17d38 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -204,7 +204,21 @@
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_OK_BUTTON" desc="Title of the button to validate the user consent [Length: 15m] [iOS only]">
         YES, I'M IN
       </message>
-
+      <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON" desc="Alert button title to ask if the user really wants to cancel sign-in and sync. This button would let the user return to the sync settings, and let them choose again.">
+        Back
+      </message>
+      <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON" desc="Alert button title to ask if the user really wants to cancel sign-in and sync. This button would let the user definitely cancel sign-in and sync.">
+        Cancel Sync
+      </message>
+      <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE" desc="Alert title to ask if the user really wants to cancel sign-in and sync. Related IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE.">
+        Cancel Sync?
+      </message>
+      <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE" desc="Alert title to ask if the user really wants to cancel sign-in and sync Related IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE.">
+        You can turn on sync anytime in settings.
+      </message>
+      <message name="IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON" desc="Button title to confirm sign-in and sync after reviewing the sync settings. Related IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_MAIN_BUTTON.">
+        Confirm
+      </message>
       <message name="IDS_IOS_APPEX_PASSWORD_FORM_FILLED_SUCCESS" desc="Message displayed when an App Extension has successfully filled a sign-in form with username and password. [Length: 30em] [iOS only]">
         Forms filled.
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON.png.sha1
new file mode 100644
index 0000000..6d0d5738
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON.png.sha1
@@ -0,0 +1 @@
+41ad0a87873b10850ee5703ad3a199526f72af73
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON.png.sha1
new file mode 100644
index 0000000..6d0d5738
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON.png.sha1
@@ -0,0 +1 @@
+41ad0a87873b10850ee5703ad3a199526f72af73
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE.png.sha1
new file mode 100644
index 0000000..6d0d5738
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE.png.sha1
@@ -0,0 +1 @@
+41ad0a87873b10850ee5703ad3a199526f72af73
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE.png.sha1
new file mode 100644
index 0000000..6d0d5738
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE.png.sha1
@@ -0,0 +1 @@
+41ad0a87873b10850ee5703ad3a199526f72af73
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON.png.sha1
new file mode 100644
index 0000000..1a91619
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON.png.sha1
@@ -0,0 +1 @@
+28440f341ae988d4485a38730e38cf3d8975847a
\ No newline at end of file
diff --git a/ios/chrome/browser/about_flags.mm b/ios/chrome/browser/about_flags.mm
index e9f8f307..4442111 100644
--- a/ios/chrome/browser/about_flags.mm
+++ b/ios/chrome/browser/about_flags.mm
@@ -53,6 +53,7 @@
 #include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h"
 #include "ios/chrome/browser/find_in_page/features.h"
 #include "ios/chrome/browser/ios_chrome_flag_descriptions.h"
+#include "ios/chrome/browser/passwords/password_manager_features.h"
 #include "ios/chrome/browser/reading_list/features.h"
 #include "ios/chrome/browser/signin/feature_flags.h"
 #include "ios/chrome/browser/system_flags.h"
@@ -569,6 +570,10 @@
      flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(
          autofill::features::kAutofillNoLocalSaveOnUnmaskSuccess)},
+    {"password-generation-suggestion",
+     flag_descriptions::kPasswordGenerationName,
+     flag_descriptions::kPasswordGenerationDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(features::kPasswordGeneration)},
 };
 
 // Add all switches from experimental flags to |command_line|.
diff --git a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
index db2e5bad..f7fc7c8 100644
--- a/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
+++ b/ios/chrome/browser/browser_state/browser_state_keyed_service_factories.mm
@@ -37,7 +37,6 @@
 #include "ios/chrome/browser/sessions/tab_restore_service_delegate_impl_ios_factory.h"
 #include "ios/chrome/browser/signin/about_signin_internals_factory.h"
 #include "ios/chrome/browser/signin/account_consistency_service_factory.h"
-#include "ios/chrome/browser/signin/account_fetcher_service_factory.h"
 #include "ios/chrome/browser/signin/account_reconcilor_factory.h"
 #include "ios/chrome/browser/signin/authentication_service_factory.h"
 #include "ios/chrome/browser/signin/identity_manager_factory.h"
@@ -79,7 +78,6 @@
   feature_engagement::TrackerFactory::GetInstance();
   ios::AboutSigninInternalsFactory::GetInstance();
   ios::AccountConsistencyServiceFactory::GetInstance();
-  ios::AccountFetcherServiceFactory::GetInstance();
   ios::AccountReconcilorFactory::GetInstance();
   ios::AutocompleteClassifierFactory::GetInstance();
   ios::BookmarkModelFactory::GetInstance();
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
index 81225fa..a85cff8 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.cc
@@ -354,6 +354,10 @@
     "Use the fullscreen implementation living outside of web. Disable the one "
     "in web.";
 
+const char kPasswordGenerationName[] = "Password generation suggestion";
+const char kPasswordGenerationDescription[] =
+    "Add 'Suggest Password' in suggestion list for form completion.";
+
 const char kPhysicalWeb[] = "Physical Web";
 const char kPhysicalWebDescription[] =
     "When enabled, the omnibox will include suggestions for web pages "
diff --git a/ios/chrome/browser/ios_chrome_flag_descriptions.h b/ios/chrome/browser/ios_chrome_flag_descriptions.h
index b5da507..b9e9e4e 100644
--- a/ios/chrome/browser/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/ios_chrome_flag_descriptions.h
@@ -287,6 +287,10 @@
 extern const char kOutOfWebFullscreenName[];
 extern const char kOutOfWebFullscreenDescription[];
 
+// Title and description for the flag to enable password generation.
+extern const char kPasswordGenerationName[];
+extern const char kPasswordGenerationDescription[];
+
 // Title and description for the flag to enable Physical Web in the omnibox.
 extern const char kPhysicalWeb[];
 extern const char kPhysicalWebDescription[];
diff --git a/ios/chrome/browser/passwords/password_controller.mm b/ios/chrome/browser/passwords/password_controller.mm
index 232c750..831abf4 100644
--- a/ios/chrome/browser/passwords/password_controller.mm
+++ b/ios/chrome/browser/passwords/password_controller.mm
@@ -97,8 +97,10 @@
 enum class PasswordSuggestionType {
   // Credentials are listed.
   CREDENTIALS = 0,
-  // Only "Show All" is listed.
+  // "Show All" is listed.
   SHOW_ALL = 1,
+  // "Suggest Password" is listed.
+  SUGGESTED = 2,
   COUNT
 };
 
@@ -403,9 +405,6 @@
       [self.suggestionHelper retrieveSuggestionsWithFormName:formName
                                              fieldIdentifier:fieldIdentifier
                                                    fieldType:fieldType];
-  PasswordSuggestionType suggestion_type =
-      rawSuggestions.count > 0 ? PasswordSuggestionType::CREDENTIALS
-                               : PasswordSuggestionType::SHOW_ALL;
 
   NSMutableArray<FormSuggestion*>* suggestions = [NSMutableArray array];
   for (FormSuggestion* rawSuggestion in rawSuggestions) {
@@ -418,6 +417,9 @@
                                      icon:nil
                                identifier:0]];
   }
+  if (suggestions.count) {
+    LogSuggestionShown(PasswordSuggestionType::CREDENTIALS);
+  }
 
   if ([self canGeneratePasswordForForm:formName
                        fieldIdentifier:fieldIdentifier
@@ -432,6 +434,7 @@
                                icon:nil
                          identifier:autofill::
                                         POPUP_ITEM_ID_GENERATE_PASSWORD_ENTRY]];
+    LogSuggestionShown(PasswordSuggestionType::SUGGESTED);
   }
 
   // Once Manual Fallback is enabled the access to settings will exist as an
@@ -448,9 +451,7 @@
                          identifier:
                              autofill::
                                  POPUP_ITEM_ID_ALL_SAVED_PASSWORDS_ENTRY]];
-  }
-  if (suggestions.count) {
-    LogSuggestionShown(suggestion_type);
+    LogSuggestionShown(PasswordSuggestionType::SHOW_ALL);
   }
 
   completion([suggestions copy], self);
@@ -475,7 +476,7 @@
                         if (injected)
                           completion();
                       }];
-      // TODO(crbug.com/886583): add metrics.
+      LogSuggestionClicked(PasswordSuggestionType::SUGGESTED);
       return;
     }
     default: {
diff --git a/ios/chrome/browser/signin/BUILD.gn b/ios/chrome/browser/signin/BUILD.gn
index 920854f6e..fc5b250 100644
--- a/ios/chrome/browser/signin/BUILD.gn
+++ b/ios/chrome/browser/signin/BUILD.gn
@@ -9,8 +9,6 @@
     "about_signin_internals_factory.h",
     "account_consistency_service_factory.h",
     "account_consistency_service_factory.mm",
-    "account_fetcher_service_factory.cc",
-    "account_fetcher_service_factory.h",
     "account_reconcilor_factory.cc",
     "account_reconcilor_factory.h",
     "account_tracker_service_factory.cc",
diff --git a/ios/chrome/browser/signin/account_fetcher_service_factory.cc b/ios/chrome/browser/signin/account_fetcher_service_factory.cc
deleted file mode 100644
index 88f517c..0000000
--- a/ios/chrome/browser/signin/account_fetcher_service_factory.cc
+++ /dev/null
@@ -1,65 +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.
-
-#include "ios/chrome/browser/signin/account_fetcher_service_factory.h"
-
-#include <utility>
-
-#include "base/no_destructor.h"
-#include "components/image_fetcher/ios/ios_image_decoder_impl.h"
-#include "components/keyed_service/ios/browser_state_dependency_manager.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/signin/core/browser/account_fetcher_service.h"
-#include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/signin/account_tracker_service_factory.h"
-#include "ios/chrome/browser/signin/profile_oauth2_token_service_factory.h"
-#include "ios/chrome/browser/signin/signin_client_factory.h"
-
-namespace ios {
-
-AccountFetcherServiceFactory::AccountFetcherServiceFactory()
-    : BrowserStateKeyedServiceFactory(
-          "AccountFetcherService",
-          BrowserStateDependencyManager::GetInstance()) {
-  DependsOn(AccountTrackerServiceFactory::GetInstance());
-  DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
-  DependsOn(SigninClientFactory::GetInstance());
-}
-
-AccountFetcherServiceFactory::~AccountFetcherServiceFactory() {}
-
-// static
-AccountFetcherService* AccountFetcherServiceFactory::GetForBrowserState(
-    ios::ChromeBrowserState* browser_state) {
-  return static_cast<AccountFetcherService*>(
-      GetInstance()->GetServiceForBrowserState(browser_state, true));
-}
-
-// static
-AccountFetcherServiceFactory* AccountFetcherServiceFactory::GetInstance() {
-  static base::NoDestructor<AccountFetcherServiceFactory> instance;
-  return instance.get();
-}
-
-void AccountFetcherServiceFactory::RegisterBrowserStatePrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  AccountFetcherService::RegisterPrefs(registry);
-}
-
-std::unique_ptr<KeyedService>
-AccountFetcherServiceFactory::BuildServiceInstanceFor(
-    web::BrowserState* context) const {
-  ios::ChromeBrowserState* browser_state =
-      ios::ChromeBrowserState::FromBrowserState(context);
-  std::unique_ptr<AccountFetcherService> service(new AccountFetcherService());
-  service->Initialize(
-      SigninClientFactory::GetForBrowserState(browser_state),
-      ProfileOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
-      ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state),
-      image_fetcher::CreateIOSImageDecoder());
-  return service;
-}
-
-}  // namespace ios
diff --git a/ios/chrome/browser/signin/account_fetcher_service_factory.h b/ios/chrome/browser/signin/account_fetcher_service_factory.h
deleted file mode 100644
index 9f889c1..0000000
--- a/ios/chrome/browser/signin/account_fetcher_service_factory.h
+++ /dev/null
@@ -1,43 +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_CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-#define IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/no_destructor.h"
-#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
-
-class AccountFetcherService;
-
-namespace ios {
-
-class ChromeBrowserState;
-
-class AccountFetcherServiceFactory : public BrowserStateKeyedServiceFactory {
- public:
-  static AccountFetcherService* GetForBrowserState(
-      ios::ChromeBrowserState* browser_state);
-  static AccountFetcherServiceFactory* GetInstance();
-
- private:
-  friend class base::NoDestructor<AccountFetcherServiceFactory>;
-
-  AccountFetcherServiceFactory();
-  ~AccountFetcherServiceFactory() override;
-
-  // BrowserStateKeyedServiceFactory implementation
-  void RegisterBrowserStatePrefs(
-      user_prefs::PrefRegistrySyncable* registry) override;
-  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
-      web::BrowserState* context) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(AccountFetcherServiceFactory);
-};
-
-}  // namespace ios
-
-#endif  // IOS_CHROME_BROWSER_SIGNIN_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/signin/identity_manager_factory.cc b/ios/chrome/browser/signin/identity_manager_factory.cc
index a2c1a63..ae50c04 100644
--- a/ios/chrome/browser/signin/identity_manager_factory.cc
+++ b/ios/chrome/browser/signin/identity_manager_factory.cc
@@ -7,6 +7,7 @@
 #include <memory>
 #include <utility>
 
+#include "components/image_fetcher/ios/ios_image_decoder_impl.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -14,7 +15,6 @@
 #include "components/signin/core/browser/signin_manager.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
-#include "ios/chrome/browser/signin/account_fetcher_service_factory.h"
 #include "ios/chrome/browser/signin/account_tracker_service_factory.h"
 #include "ios/chrome/browser/signin/identity_manager_factory_observer.h"
 #include "ios/chrome/browser/signin/profile_oauth2_token_service_factory.h"
@@ -26,6 +26,18 @@
 #include "services/identity/public/cpp/primary_account_mutator_impl.h"
 
 namespace {
+
+std::unique_ptr<AccountFetcherService> BuildAccountFetcherService(
+    SigninClient* signin_client,
+    OAuth2TokenService* token_service,
+    AccountTrackerService* account_tracker_service) {
+  auto account_fetcher_service = std::make_unique<AccountFetcherService>();
+  account_fetcher_service->Initialize(signin_client, token_service,
+                                      account_tracker_service,
+                                      image_fetcher::CreateIOSImageDecoder());
+  return account_fetcher_service;
+}
+
 std::unique_ptr<SigninManager> BuildSigninManager(
     ios::ChromeBrowserState* chrome_browser_state,
     GaiaCookieManagerService* gaia_cookie_manager_service) {
@@ -54,6 +66,7 @@
   IdentityManagerWrapper(
       std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service,
       std::unique_ptr<SigninManagerBase> signin_manager,
+      std::unique_ptr<AccountFetcherService> account_fetcher_service,
       std::unique_ptr<identity::PrimaryAccountMutator> primary_account_mutator,
       std::unique_ptr<identity::AccountsCookieMutatorImpl>
           accounts_cookie_mutator,
@@ -62,9 +75,8 @@
       : identity::IdentityManager(
             std::move(gaia_cookie_manager_service),
             std::move(signin_manager),
+            std::move(account_fetcher_service),
             ProfileOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
-            ios::AccountFetcherServiceFactory::GetForBrowserState(
-                browser_state),
             ios::AccountTrackerServiceFactory::GetForBrowserState(
                 browser_state),
             std::move(primary_account_mutator),
@@ -85,7 +97,6 @@
     : BrowserStateKeyedServiceFactory(
           "IdentityManager",
           BrowserStateDependencyManager::GetInstance()) {
-  DependsOn(ios::AccountFetcherServiceFactory::GetInstance());
   DependsOn(ios::AccountTrackerServiceFactory::GetInstance());
   DependsOn(ProfileOAuth2TokenServiceFactory::GetInstance());
   DependsOn(SigninClientFactory::GetInstance());
@@ -153,10 +164,16 @@
       std::make_unique<identity::DiagnosticsProviderImpl>(
           ProfileOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
           gaia_cookie_manager_service.get());
+  std::unique_ptr<AccountFetcherService> account_fetcher_service =
+      BuildAccountFetcherService(
+          SigninClientFactory::GetForBrowserState(browser_state),
+          ProfileOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
+          ios::AccountTrackerServiceFactory::GetForBrowserState(browser_state));
   auto identity_manager = std::make_unique<IdentityManagerWrapper>(
       std::move(gaia_cookie_manager_service), std::move(signin_manager),
-      std::move(primary_account_mutator), std::move(accounts_cookie_mutator),
-      std::move(diagnostics_provider), browser_state);
+      std::move(account_fetcher_service), std::move(primary_account_mutator),
+      std::move(accounts_cookie_mutator), std::move(diagnostics_provider),
+      browser_state);
 
   for (auto& observer : observer_list_)
     observer.IdentityManagerCreated(identity_manager.get());
diff --git a/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm b/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
index a9802af..b8de37e 100644
--- a/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
+++ b/ios/chrome/browser/ui/autofill/manual_fill/chip_button.mm
@@ -33,6 +33,11 @@
   self = [super initWithFrame:frame];
   if (self) {
     [self initializeStyling];
+    [[NSNotificationCenter defaultCenter]
+        addObserver:self
+           selector:@selector(updateTitleLabelFont)
+               name:UIContentSizeCategoryDidChangeNotification
+             object:nil];
   }
   return self;
 }
@@ -100,13 +105,16 @@
              forState:UIControlStateNormal];
   self.titleLabel.adjustsFontForContentSizeCategory = YES;
 
+  [self updateTitleLabelFont];
+  self.contentEdgeInsets = [self chipEdgeInsets];
+}
+
+- (void)updateTitleLabelFont {
   UIFont* font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline];
   UIFontDescriptor* boldFontDescriptor = [font.fontDescriptor
       fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
   DCHECK(boldFontDescriptor);
   self.titleLabel.font = [UIFont fontWithDescriptor:boldFontDescriptor size:0];
-
-  self.contentEdgeInsets = [self chipEdgeInsets];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn
index 977a39fd..525af18 100644
--- a/ios/chrome/browser/ui/browser_view/BUILD.gn
+++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -30,6 +30,7 @@
     "//components/signin/ios/browser",
     "//components/signin/ios/browser:active_state_manager",
     "//components/strings",
+    "//components/unified_consent",
     "//components/url_formatter",
     "//ios/chrome/app:tests_hook",
     "//ios/chrome/app/strings",
diff --git a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
index 8639e01..f7a7925 100644
--- a/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view/browser_view_controller.mm
@@ -32,6 +32,7 @@
 #import "components/signin/ios/browser/account_consistency_service.h"
 #include "components/signin/ios/browser/active_state_manager.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/app/tests_hook.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
@@ -4905,7 +4906,11 @@
 }
 
 - (void)showSyncSettings {
-  [self.dispatcher showSyncSettingsFromViewController:self];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    [self.dispatcher showGoogleServicesSettingsFromViewController:self];
+  } else {
+    [self.dispatcher showSyncSettingsFromViewController:self];
+  }
 }
 
 - (void)showSyncPassphraseSettings {
diff --git a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
index fa951894..0ebfb71c 100644
--- a/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
+++ b/ios/chrome/browser/ui/recent_tabs/recent_tabs_table_view_controller.mm
@@ -1114,7 +1114,11 @@
 }
 
 - (void)showSyncSettings {
-  [self.dispatcher showSyncSettingsFromViewController:self];
+  if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+    [self.dispatcher showGoogleServicesSettingsFromViewController:self];
+  } else {
+    [self.dispatcher showSyncSettingsFromViewController:self];
+  }
 }
 
 - (void)showSyncPassphraseSettings {
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
index c99dc926..507456ee 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.h
@@ -7,7 +7,6 @@
 
 #import "ios/chrome/browser/ui/settings/settings_root_collection_view_controller.h"
 
-#import "ios/chrome/browser/browsing_data/browsing_data_remover_observer_bridge.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h"
 
 namespace ios {
@@ -17,8 +16,7 @@
 // CollectionView for clearing browsing data (including history,
 // cookies, caches, passwords, and autofill).
 @interface ClearBrowsingDataCollectionViewController
-    : SettingsRootCollectionViewController <ClearBrowsingDataConsumer,
-                                            BrowsingDataRemoverObserving>
+    : SettingsRootCollectionViewController <ClearBrowsingDataConsumer>
 
 - (instancetype)initWithBrowserState:(ios::ChromeBrowserState*)browserState
     NS_DESIGNATED_INITIALIZER;
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
index 7871b53..a1aa63e 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_collection_view_controller.mm
@@ -49,14 +49,6 @@
 
 @interface ClearBrowsingDataCollectionViewController () {
   ios::ChromeBrowserState* _browserState;  // weak
-
-  // 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.
-  std::unique_ptr<BrowsingDataRemoverObserver> observer_;
-  std::unique_ptr<
-      ScopedObserver<BrowsingDataRemover, BrowsingDataRemoverObserver>>
-      scoped_observer_;
 }
 
 // TODO(crbug.com/850699): remove direct dependency and replace with
@@ -71,9 +63,6 @@
 @property(nonatomic, strong)
     ChromeActivityOverlayCoordinator* chromeActivityOverlayCoordinator;
 
-// Restarts the counters for data types specified in the mask.
-- (void)restartCounters:(BrowsingDataRemoveMask)mask;
-
 @end
 
 @implementation ClearBrowsingDataCollectionViewController
@@ -101,15 +90,6 @@
     self.title = l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_TITLE);
     self.collectionViewAccessibilityIdentifier =
         kClearBrowsingDataCollectionViewAccessibilityIdentifier;
-
-    if (IsNewClearBrowsingDataUIEnabled()) {
-      observer_ = std::make_unique<BrowsingDataRemoverObserverBridge>(self);
-      scoped_observer_ = std::make_unique<
-          ScopedObserver<BrowsingDataRemover, BrowsingDataRemoverObserver>>(
-          observer_.get());
-      scoped_observer_->Add(
-          BrowsingDataRemoverFactory::GetForBrowserState(browserState));
-    }
   }
   return self;
 }
@@ -122,7 +102,7 @@
 
 - (void)viewWillAppear:(BOOL)animated {
   [super viewWillAppear:animated];
-  [self restartCounters:BrowsingDataRemoveMask::REMOVE_ALL];
+  [self.dataManager restartCounters:BrowsingDataRemoveMask::REMOVE_ALL];
 }
 
 #pragma mark CollectionViewController
@@ -141,28 +121,6 @@
   [self.collectionView.collectionViewLayout invalidateLayout];
 }
 
-- (void)updateCounter:(NSInteger)itemType detailText:(NSString*)detailText {
-  CollectionViewModel* model = self.collectionViewModel;
-  if (!model)
-    return;
-
-  NSIndexPath* indexPath =
-      [model indexPathForItemType:itemType
-                sectionIdentifier:SectionIdentifierDataTypes];
-
-  ClearBrowsingDataItem* clearDataItem =
-      base::mac::ObjCCastStrict<ClearBrowsingDataItem>(
-          [model itemAtIndexPath:indexPath]);
-
-  // Do nothing if the text has not changed.
-  if ([detailText isEqualToString:clearDataItem.detailText])
-    return;
-
-  clearDataItem.detailText = detailText;
-  [self reconfigureCellsForItems:@[ clearDataItem ]];
-  [self.collectionView.collectionViewLayout invalidateLayout];
-}
-
 - (void)showBrowsingHistoryRemovedDialog {
   NSString* title =
       l10n_util::GetNSString(IDS_IOS_CLEAR_BROWSING_DATA_HISTORY_NOTICE_TITLE);
@@ -314,59 +272,6 @@
   [self.dispatcher closeSettingsUIAndOpenURL:openMyActivityCommand];
 }
 
-- (void)restartCounters:(BrowsingDataRemoveMask)mask {
-  CollectionViewModel* model = self.collectionViewModel;
-  if (!self.collectionViewModel)
-    return;
-
-  if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_HISTORY)) {
-    NSIndexPath* indexPath = [self.collectionViewModel
-        indexPathForItemType:ItemTypeDataTypeBrowsingHistory
-           sectionIdentifier:SectionIdentifierDataTypes];
-    ClearBrowsingDataItem* historyItem =
-        base::mac::ObjCCastStrict<ClearBrowsingDataItem>(
-            [model itemAtIndexPath:indexPath]);
-    [historyItem restartCounter];
-  }
-
-  if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_CACHE)) {
-    NSIndexPath* indexPath = [self.collectionViewModel
-        indexPathForItemType:ItemTypeDataTypeCache
-           sectionIdentifier:SectionIdentifierDataTypes];
-    ClearBrowsingDataItem* cacheItem =
-        base::mac::ObjCCastStrict<ClearBrowsingDataItem>(
-            [model itemAtIndexPath:indexPath]);
-    [cacheItem restartCounter];
-  }
-
-  if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_PASSWORDS)) {
-    NSIndexPath* indexPath = [self.collectionViewModel
-        indexPathForItemType:ItemTypeDataTypeSavedPasswords
-           sectionIdentifier:SectionIdentifierDataTypes];
-    ClearBrowsingDataItem* passwordsItem =
-        base::mac::ObjCCastStrict<ClearBrowsingDataItem>(
-            [model itemAtIndexPath:indexPath]);
-    [passwordsItem restartCounter];
-  }
-
-  if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_FORM_DATA)) {
-    NSIndexPath* indexPath = [self.collectionViewModel
-        indexPathForItemType:ItemTypeDataTypeAutofill
-           sectionIdentifier:SectionIdentifierDataTypes];
-    ClearBrowsingDataItem* autofillItem =
-        base::mac::ObjCCastStrict<ClearBrowsingDataItem>(
-            [model itemAtIndexPath:indexPath]);
-    [autofillItem restartCounter];
-  }
-}
-
-#pragma mark BrowsingDataRemoverObserving
-
-- (void)browsingDataRemover:(BrowsingDataRemover*)remover
-    didRemoveBrowsingDataWithMask:(BrowsingDataRemoveMask)mask {
-  [self restartCounters:mask];
-}
-
 #pragma mark MDCCollectionViewStylingDelegate
 
 - (BOOL)collectionView:(UICollectionView*)collectionView
diff --git a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h
index 1f20b30f..fd79568 100644
--- a/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h
+++ b/ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h
@@ -33,11 +33,6 @@
 // Indicate to user that data has been cleared.
 - (void)showBrowsingHistoryRemovedDialog;
 
-// Only necessary for ClearBrowsingDataCollectionView to implement
-// IsNewClearBrowsingDataUIEnabled experiment.
-@optional
-// Updates item of |itemType| with |detailText|.
-- (void)updateCounter:(NSInteger)itemType detailText:(NSString*)detailText;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_SETTINGS_CLEAR_BROWSING_DATA_CLEAR_BROWSING_DATA_CONSUMER_H_
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 bd95e2bb..c9db0e2 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
@@ -7,6 +7,7 @@
 
 #import <Foundation/Foundation.h>
 
+#import "ios/chrome/browser/browsing_data/browsing_data_remover_observer_bridge.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/clear_browsing_data_consumer.h"
 #import "ios/chrome/browser/ui/settings/clear_browsing_data/time_range_selector_table_view_controller.h"
 
@@ -69,7 +70,8 @@
 // Manager that serves as the bulk of the logic for
 // ClearBrowsingDataConsumer.
 @interface ClearBrowsingDataManager
-    : NSObject <TimeRangeSelectorTableViewControllerDelegate>
+    : NSObject <BrowsingDataRemoverObserving,
+                TimeRangeSelectorTableViewControllerDelegate>
 
 // The manager's consumer.
 @property(nonatomic, assign) id<ClearBrowsingDataConsumer> consumer;
@@ -86,6 +88,10 @@
 // Fills |model| with appropriate sections and items.
 - (void)loadModel:(ListModel*)model;
 
+// Restarts browsing data counters, which in turn updates UI, with those data
+// types specified by |mask|.
+- (void)restartCounters:(BrowsingDataRemoveMask)mask;
+
 // Returns a ActionSheetCoordinator that has action block to clear data of type
 // |dataTypeMaskToRemove|.
 // When action triggered by a UIButton.
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 588dc8fa..f692c7e 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
@@ -22,6 +22,8 @@
 #include "ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_features.h"
 #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
+#include "ios/chrome/browser/browsing_data/browsing_data_remover.h"
+#include "ios/chrome/browser/browsing_data/browsing_data_remover_factory.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
 #include "ios/chrome/browser/feature_engagement/tracker_factory.h"
 #include "ios/chrome/browser/history/web_history_service_factory.h"
@@ -63,11 +65,35 @@
 // The tableView button red background color.
 const CGFloat kTableViewButtonBackgroundColor = 0xE94235;
 
+// List of flags that have corresponding counters.
+const std::vector<BrowsingDataRemoveMask> _browsingDataRemoveFlags = {
+    // BrowsingDataRemoveMask::REMOVE_COOKIES not included; we don't have cookie
+    // counters yet.
+    BrowsingDataRemoveMask::REMOVE_HISTORY,
+    BrowsingDataRemoveMask::REMOVE_CACHE,
+    BrowsingDataRemoveMask::REMOVE_PASSWORDS,
+    BrowsingDataRemoveMask::REMOVE_FORM_DATA,
+};
+
 }  // namespace
 
 @interface ClearBrowsingDataManager () {
   // Access to the kDeleteTimePeriod preference.
   IntegerPrefMember _timeRangePref;
+
+  // 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.
+  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.
+  std::map<BrowsingDataRemoveMask, std::unique_ptr<BrowsingDataCounterWrapper>>
+      _countersByMasks;
 }
 
 @property(nonatomic, assign) ios::ChromeBrowserState* browserState;
@@ -109,6 +135,15 @@
 
     _timeRangePref.Init(browsing_data::prefs::kDeleteTimePeriod,
                         _browserState->GetPrefs());
+
+    if (IsNewClearBrowsingDataUIEnabled()) {
+      observer_ = std::make_unique<BrowsingDataRemoverObserverBridge>(self);
+      scoped_observer_ = std::make_unique<
+          ScopedObserver<BrowsingDataRemover, BrowsingDataRemoverObserver>>(
+          observer_.get());
+      scoped_observer_->Add(
+          BrowsingDataRemoverFactory::GetForBrowserState(self.browserState));
+    }
   }
   return self;
 }
@@ -323,6 +358,17 @@
       }));
 }
 
+- (void)restartCounters:(BrowsingDataRemoveMask)mask {
+  for (auto flag : _browsingDataRemoveFlags) {
+    if (IsRemoveDataMaskSet(mask, flag)) {
+      const auto it = _countersByMasks.find(flag);
+      if (it != _countersByMasks.end()) {
+        it->second->RestartCounter();
+      }
+    }
+  }
+}
+
 #pragma mark Items
 
 - (ListItem*)clearButtonItem {
@@ -361,25 +407,12 @@
                               mask:(BrowsingDataRemoveMask)mask
                           prefName:(const char*)prefName {
   PrefService* prefs = self.browserState->GetPrefs();
-  std::unique_ptr<BrowsingDataCounterWrapper> counter;
-  if (IsNewClearBrowsingDataUIEnabled()) {
-    __weak ClearBrowsingDataManager* weakSelf = self;
-    counter = BrowsingDataCounterWrapper::CreateCounterWrapper(
-        prefName, self.browserState, prefs,
-        base::BindRepeating(
-            ^(const browsing_data::BrowsingDataCounter::Result& result) {
-              [weakSelf.consumer
-                  updateCounter:itemType
-                     detailText:[weakSelf counterTextFromResult:result]];
-            }));
-  }
   ListItem* clearDataItem;
   // Create a ClearBrowsingDataItem for a CollectionView model and a
   // TableViewClearBrowsingDataItem for a TableView model.
   if (self.listType == ClearBrowsingDataListType::kListTypeCollectionView) {
     ClearBrowsingDataItem* collectionClearDataItem =
-        [[ClearBrowsingDataItem alloc] initWithType:itemType
-                                            counter:std::move(counter)];
+        [[ClearBrowsingDataItem alloc] initWithType:itemType counter:nullptr];
     collectionClearDataItem.text = l10n_util::GetNSString(titleMessageID);
     if (prefs->GetBoolean(prefName)) {
       collectionClearDataItem.accessoryType =
@@ -389,13 +422,28 @@
     collectionClearDataItem.prefName = prefName;
     collectionClearDataItem.accessibilityIdentifier =
         [self accessibilityIdentifierFromItemType:itemType];
-
-    // Because there is no counter for cookies, an explanatory text is
-    // displayed.
-    if (itemType == ItemTypeDataTypeCookiesSiteData &&
-        IsNewClearBrowsingDataUIEnabled()) {
-      collectionClearDataItem.detailText =
-          l10n_util::GetNSString(IDS_DEL_COOKIES_COUNTER);
+    if (IsNewClearBrowsingDataUIEnabled()) {
+      if (itemType == ItemTypeDataTypeCookiesSiteData) {
+        // Because there is no counter for cookies, an explanatory text is
+        // displayed.
+        collectionClearDataItem.detailText =
+            l10n_util::GetNSString(IDS_DEL_COOKIES_COUNTER);
+      } else {
+        __weak ClearBrowsingDataManager* weakSelf = self;
+        __weak ClearBrowsingDataItem* weakCollectionClearDataItem =
+            collectionClearDataItem;
+        std::unique_ptr<BrowsingDataCounterWrapper> counter =
+            BrowsingDataCounterWrapper::CreateCounterWrapper(
+                prefName, self.browserState, prefs,
+                base::BindRepeating(^(
+                    const browsing_data::BrowsingDataCounter::Result& result) {
+                  weakCollectionClearDataItem.detailText =
+                      [weakSelf counterTextFromResult:result];
+                  [weakSelf.consumer
+                      updateCellsForItem:weakCollectionClearDataItem];
+                }));
+        _countersByMasks.emplace(mask, std::move(counter));
+      }
     }
     clearDataItem = collectionClearDataItem;
   } else {
@@ -713,4 +761,11 @@
   }
 }
 
+#pragma mark BrowsingDataRemoverObserving
+
+- (void)browsingDataRemover:(BrowsingDataRemover*)remover
+    didRemoveBrowsingDataWithMask:(BrowsingDataRemoveMask)mask {
+  [self restartCounters:mask];
+}
+
 @end
diff --git a/ios/chrome/browser/ui/settings/google_services/BUILD.gn b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
index 3d634ee..dc1f49c 100644
--- a/ios/chrome/browser/ui/settings/google_services/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/google_services/BUILD.gn
@@ -7,6 +7,10 @@
   sources = [
     "accounts_table_view_controller.h",
     "accounts_table_view_controller.mm",
+    "advanced_signin_settings_coordinator.h",
+    "advanced_signin_settings_coordinator.mm",
+    "advanced_signin_settings_navigation_controller.h",
+    "advanced_signin_settings_navigation_controller.mm",
     "google_services_navigation_coordinator.h",
     "google_services_navigation_coordinator.mm",
     "google_services_settings_command_handler.h",
@@ -69,6 +73,8 @@
     "//services/identity/public/objc",
     "//ui/base",
   ]
+  allow_circular_includes_from =
+      [ "//ios/chrome/browser/ui/signin_interaction" ]
 }
 
 source_set("eg_tests") {
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h
new file mode 100644
index 0000000..a2afd87
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h
@@ -0,0 +1,37 @@
+// 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 IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
+
+#import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h"
+
+@class AdvancedSigninSettingsCoordinator;
+
+// AdvancedSigninSettingsCoordinator delegate.
+@protocol AdvancedSigninSettingsCoordinatorDelegate <NSObject>
+
+// Called when the user closes AdvancedSigninSettingsCoordinator.
+- (void)advancedSigninSettingsCoordinatorDidClose:
+            (AdvancedSigninSettingsCoordinator*)coordinator
+                                          success:(BOOL)success;
+
+@end
+
+// Shows the Google services settings in a navigation controller, so the user
+// can update their sync settings before sync starts (or sign-out).
+@interface AdvancedSigninSettingsCoordinator : ChromeCoordinator
+
+// Delegate.
+@property(nonatomic, weak) id<AdvancedSigninSettingsCoordinatorDelegate>
+    delegate;
+
+// Cancels the coordinator, and calls the delegate. This method does nothing if
+// called twice.
+// |dismiss|, dismisses the view controller if YES.
+- (void)cancelWithDismiss:(BOOL)dismiss;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm
new file mode 100644
index 0000000..1b3ec75
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.mm
@@ -0,0 +1,174 @@
+// 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 "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h"
+
+#import <UIKit/UIKit.h>
+
+#include "base/logging.h"
+#include "components/signin/core/browser/signin_metrics.h"
+#include "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/signin/authentication_service.h"
+#import "ios/chrome/browser/signin/authentication_service_factory.h"
+#include "ios/chrome/browser/sync/sync_setup_service.h"
+#include "ios/chrome/browser/sync/sync_setup_service_factory.h"
+#import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
+#import "ios/chrome/browser/ui/icons/chrome_icon.h"
+#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h"
+#import "ios/chrome/browser/ui/settings/google_services/google_services_settings_coordinator.h"
+#include "ios/chrome/grit/ios_strings.h"
+#include "ui/base/l10n/l10n_util_mac.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using l10n_util::GetNSString;
+
+@interface AdvancedSigninSettingsCoordinator ()
+
+// Google services settings coordinator.
+@property(nonatomic, strong)
+    GoogleServicesSettingsCoordinator* googleServicesSettingsCoordinator;
+// Advanced signin settings navigation controller.
+@property(nonatomic, strong) AdvancedSigninSettingsNavigationController*
+    advancedSigninSettingsNavigationController;
+// Confirm cancel sign-in/sync dialog.
+@property(nonatomic, strong)
+    AlertCoordinator* cancelConfirmationAlertCoordinator;
+
+@end
+
+@implementation AdvancedSigninSettingsCoordinator
+
+- (void)start {
+  self.advancedSigninSettingsNavigationController =
+      [[AdvancedSigninSettingsNavigationController alloc] init];
+  self.googleServicesSettingsCoordinator = [[GoogleServicesSettingsCoordinator
+      alloc]
+      initWithBaseViewController:self.advancedSigninSettingsNavigationController
+                    browserState:self.browserState];
+  self.googleServicesSettingsCoordinator.navigationController =
+      self.advancedSigninSettingsNavigationController;
+  [self.googleServicesSettingsCoordinator start];
+  self.googleServicesSettingsCoordinator.viewController.navigationItem
+      .leftBarButtonItem = [self navigationCancelButton];
+  self.googleServicesSettingsCoordinator.viewController.navigationItem
+      .rightBarButtonItem = [self navigationConfirmButton];
+  [self.baseViewController
+      presentViewController:self.advancedSigninSettingsNavigationController
+                   animated:YES
+                 completion:nil];
+}
+
+- (void)cancelWithDismiss:(BOOL)dismiss {
+  if (!self.advancedSigninSettingsNavigationController) {
+    return;
+  }
+  DCHECK_EQ(self.advancedSigninSettingsNavigationController,
+            self.baseViewController.presentedViewController);
+  void (^completion)(void) = ^{
+    [self finishedWithSuccess:NO];
+  };
+  if (dismiss) {
+    [self.baseViewController dismissViewControllerAnimated:YES
+                                                completion:completion];
+  } else {
+    completion();
+  }
+}
+
+#pragma mark - Private
+
+// Called once the view controller has been removed (if needed).
+// |success|, YES if the user accepts to sync.
+- (void)finishedWithSuccess:(BOOL)success {
+  DCHECK(self.advancedSigninSettingsNavigationController);
+  if (success) {
+    SyncSetupServiceFactory::GetForBrowserState(self.browserState)
+        ->CommitChanges();
+  } else {
+    AuthenticationServiceFactory::GetForBrowserState(self.browserState)
+        ->SignOut(signin_metrics::ABORT_SIGNIN, nil);
+  }
+  [self.delegate advancedSigninSettingsCoordinatorDidClose:self
+                                                   success:success];
+  self.advancedSigninSettingsNavigationController = nil;
+}
+
+// This method should be moved to the view controller.
+- (UIBarButtonItem*)navigationCancelButton {
+  UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc]
+      initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                           target:self
+                           action:@selector(navigationCancelButtonAction)];
+  return cancelButton;
+}
+
+// This method should be moved to the view controller.
+- (UIBarButtonItem*)navigationConfirmButton {
+  UIBarButtonItem* confirmButton = [[UIBarButtonItem alloc]
+      initWithTitle:GetNSString(
+                        IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CONFIRM_MAIN_BUTTON)
+              style:UIBarButtonItemStyleDone
+             target:self
+             action:@selector(navigationConfirmButtonAction)];
+  return confirmButton;
+}
+
+// Called by the cancel button from the navigation controller. Presents a
+// UIAlert to ask the user if wants to cancel the sign-in.
+- (void)navigationCancelButtonAction {
+  self.cancelConfirmationAlertCoordinator = [[AlertCoordinator alloc]
+      initWithBaseViewController:self.advancedSigninSettingsNavigationController
+                           title:
+                               GetNSString(
+                                   IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_TITLE)
+                         message:
+                             GetNSString(
+                                 IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_MESSAGE)];
+  __weak __typeof(self) weakSelf = self;
+  [self.cancelConfirmationAlertCoordinator
+      addItemWithTitle:
+          GetNSString(
+              IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_BACK_BUTTON)
+                action:^{
+                  [weakSelf alertButtonActionWithCancelSync:NO];
+                }
+                 style:UIAlertActionStyleCancel];
+  [self.cancelConfirmationAlertCoordinator
+      addItemWithTitle:
+          GetNSString(
+              IDS_IOS_ADVANCED_SIGNIN_SETTINGS_CANCEL_SYNC_ALERT_CANCEL_SYNC_BUTTON)
+                action:^{
+                  [weakSelf alertButtonActionWithCancelSync:YES];
+                }
+                 style:UIAlertActionStyleDefault];
+  [self.cancelConfirmationAlertCoordinator start];
+}
+
+// Called by the confirm button from tne navigation controller. Validates the
+// sync preferences chosen by the user, starts the sync, close the completion
+// callback and closes the advanced sign-in settings.
+- (void)navigationConfirmButtonAction {
+  DCHECK_EQ(self.advancedSigninSettingsNavigationController,
+            self.baseViewController.presentedViewController);
+  void (^completion)(void) = ^{
+    [self finishedWithSuccess:YES];
+  };
+  [self.baseViewController dismissViewControllerAnimated:YES
+                                              completion:completion];
+}
+
+// Called when a button of |self.cancelConfirmationAlertCoordinator| is pressed.
+- (void)alertButtonActionWithCancelSync:(BOOL)cancelSync {
+  DCHECK(self.cancelConfirmationAlertCoordinator);
+  [self.cancelConfirmationAlertCoordinator stop];
+  self.cancelConfirmationAlertCoordinator = nil;
+  if (cancelSync) {
+    [self cancelWithDismiss:YES];
+  }
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h
new file mode 100644
index 0000000..4f57c5c
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.h
@@ -0,0 +1,15 @@
+// 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_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
+
+#import <UIKit/UIKit.h>
+
+// View controller to related to AdvancedSigninSettingsCoordinator.
+@interface AdvancedSigninSettingsNavigationController : UINavigationController
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_SETTINGS_GOOGLE_SERVICES_ADVANCED_SIGNIN_SETTINGS_NAVIGATION_CONTROLLER_H_
diff --git a/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.mm b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.mm
new file mode 100644
index 0000000..dbad3c6
--- /dev/null
+++ b/ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_navigation_controller.mm
@@ -0,0 +1,25 @@
+// 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/google_services/advanced_signin_settings_navigation_controller.h"
+
+#import "ios/chrome/browser/ui/settings/settings_navigation_controller.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+@implementation AdvancedSigninSettingsNavigationController
+
+- (UIViewController*)popViewControllerAnimated:(BOOL)animated {
+  UIViewController* poppedViewController =
+      [super popViewControllerAnimated:animated];
+  if ([poppedViewController
+          respondsToSelector:@selector(viewControllerWasPopped)]) {
+    [poppedViewController performSelector:@selector(viewControllerWasPopped)];
+  }
+  return poppedViewController;
+}
+
+@end
diff --git a/ios/chrome/browser/ui/settings/sync/BUILD.gn b/ios/chrome/browser/ui/settings/sync/BUILD.gn
index 4e471c4..8b1ae97 100644
--- a/ios/chrome/browser/ui/settings/sync/BUILD.gn
+++ b/ios/chrome/browser/ui/settings/sync/BUILD.gn
@@ -22,6 +22,7 @@
     "//components/prefs",
     "//components/strings",
     "//components/sync",
+    "//components/unified_consent",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser",
diff --git a/ios/chrome/browser/ui/settings/sync/sync_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/sync/sync_settings_table_view_controller.mm
index dff8c0d..da1e4d9 100644
--- a/ios/chrome/browser/ui/settings/sync/sync_settings_table_view_controller.mm
+++ b/ios/chrome/browser/ui/settings/sync/sync_settings_table_view_controller.mm
@@ -15,6 +15,7 @@
 #include "components/sync/base/model_type.h"
 #include "components/sync/driver/sync_service.h"
 #include "components/sync/driver/sync_user_settings.h"
+#include "components/unified_consent/feature.h"
 #include "ios/chrome/browser/application_context.h"
 #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
@@ -615,7 +616,11 @@
                                                      ACCESS_POINT_UNKNOWN]
         baseViewController:self];
   } else if (ShouldShowSyncSettings(syncState)) {
-    [self.dispatcher showSyncSettingsFromViewController:self];
+    if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
+      [self.dispatcher showGoogleServicesSettingsFromViewController:self];
+    } else {
+      [self.dispatcher showSyncSettingsFromViewController:self];
+    }
   } else if (ShouldShowSyncPassphraseSettings(syncState)) {
     [self.dispatcher showSyncPassphraseSettingsFromViewController:self];
   }
diff --git a/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm b/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm
index 96bd12e..60f4a8f 100644
--- a/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm
+++ b/ios/chrome/browser/ui/signin_interaction/signin_interaction_coordinator.mm
@@ -10,6 +10,7 @@
 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
 #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h"
 #import "ios/chrome/browser/ui/commands/application_commands.h"
+#import "ios/chrome/browser/ui/settings/google_services/advanced_signin_settings_coordinator.h"
 #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_controller.h"
 #import "ios/chrome/browser/ui/signin_interaction/signin_interaction_presenting.h"
 
@@ -17,7 +18,9 @@
 #error "This file requires ARC support."
 #endif
 
-@interface SigninInteractionCoordinator ()<SigninInteractionPresenting>
+@interface SigninInteractionCoordinator () <
+    AdvancedSigninSettingsCoordinatorDelegate,
+    SigninInteractionPresenting>
 
 // Coordinator to present alerts.
 @property(nonatomic, strong) AlertCoordinator* alertCoordinator;
@@ -40,6 +43,10 @@
 // Sign-in completion.
 @property(nonatomic, copy) signin_ui::CompletionCallback signinCompletion;
 
+// Advanced sign-in settings coordinator.
+@property(nonatomic, strong)
+    AdvancedSigninSettingsCoordinator* advancedSigninSettingsCoordinator;
+
 @end
 
 @implementation SigninInteractionCoordinator
@@ -111,16 +118,28 @@
 
 - (void)cancel {
   [self.controller cancel];
+  [self.advancedSigninSettingsCoordinator cancelWithDismiss:NO];
 }
 
 - (void)cancelAndDismiss {
   [self.controller cancelAndDismiss];
+  [self.advancedSigninSettingsCoordinator cancelWithDismiss:YES];
 }
 
 - (BOOL)isActive {
   return self.controller != nil;
 }
 
+#pragma mark - AdvancedSigninSettingsCoordinatorDelegates
+
+- (void)advancedSigninSettingsCoordinatorDidClose:
+            (AdvancedSigninSettingsCoordinator*)coordinator
+                                          success:(BOOL)success {
+  DCHECK_EQ(self.advancedSigninSettingsCoordinator, coordinator);
+  self.advancedSigninSettingsCoordinator = nil;
+  [self signinDoneWithSuccess:success];
+}
+
 #pragma mark - SigninInteractionPresenting
 
 - (void)presentViewController:(UIViewController*)viewController
@@ -217,22 +236,38 @@
   self.alertCoordinator = nil;
   if (signinResult == SigninResultSignedInnAndOpennSettings) {
     [self showAccountsSettings];
-  }
-  if (self.signinCompletion) {
-    self.signinCompletion(signinResult != SigninResultCanceled);
-    self.signinCompletion = nil;
+  } else {
+    [self signinDoneWithSuccess:signinResult != SigninResultCanceled];
   }
 }
 
 // Shows the accounts settings UI.
 - (void)showAccountsSettings {
   if (unified_consent::IsUnifiedConsentFeatureEnabled()) {
-    [self.dispatcher showGoogleServicesSettingsFromViewController:
-                         self.presentingViewController];
+    DCHECK(!self.advancedSigninSettingsCoordinator);
+    self.advancedSigninSettingsCoordinator =
+        [[AdvancedSigninSettingsCoordinator alloc]
+            initWithBaseViewController:self.presentingViewController
+                          browserState:self.browserState];
+    self.advancedSigninSettingsCoordinator.delegate = self;
+    [self.advancedSigninSettingsCoordinator start];
   } else {
+    [self signinDoneWithSuccess:YES];
     [self.dispatcher
         showAccountsSettingsFromViewController:self.presentingViewController];
   }
 }
 
+// Called when the sign-in is done.
+- (void)signinDoneWithSuccess:(BOOL)success {
+  DCHECK(!self.controller);
+  DCHECK(!self.topViewController);
+  DCHECK(!self.alertCoordinator);
+  if (self.signinCompletion) {
+    self.signinCompletion(success);
+    self.signinCompletion = nil;
+  }
+  self.advancedSigninSettingsCoordinator = nil;
+}
+
 @end
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index a4ae19d..0d6b08e4 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -162,8 +162,6 @@
   "internal/pref_names.mm",
   "internal/signin/ios_web_view_signin_client.h",
   "internal/signin/ios_web_view_signin_client.mm",
-  "internal/signin/web_view_account_fetcher_service_factory.h",
-  "internal/signin/web_view_account_fetcher_service_factory.mm",
   "internal/signin/web_view_account_tracker_service_factory.h",
   "internal/signin/web_view_account_tracker_service_factory.mm",
   "internal/signin/web_view_identity_manager_factory.h",
diff --git a/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h b/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h
deleted file mode 100644
index 98aabc0..0000000
--- a/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h
+++ /dev/null
@@ -1,44 +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_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-#define IOS_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/no_destructor.h"
-#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
-
-class AccountFetcherService;
-
-namespace ios_web_view {
-
-class WebViewBrowserState;
-
-class WebViewAccountFetcherServiceFactory
-    : public BrowserStateKeyedServiceFactory {
- public:
-  static AccountFetcherService* GetForBrowserState(
-      ios_web_view::WebViewBrowserState* browser_state);
-  static WebViewAccountFetcherServiceFactory* GetInstance();
-
- private:
-  friend class base::NoDestructor<WebViewAccountFetcherServiceFactory>;
-
-  WebViewAccountFetcherServiceFactory();
-  ~WebViewAccountFetcherServiceFactory() override = default;
-
-  // BrowserStateKeyedServiceFactory implementation
-  void RegisterBrowserStatePrefs(
-      user_prefs::PrefRegistrySyncable* registry) override;
-  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
-      web::BrowserState* context) const override;
-
-  DISALLOW_COPY_AND_ASSIGN(WebViewAccountFetcherServiceFactory);
-};
-
-}  // namespace ios_web_view
-
-#endif  // IOS_WEB_VIEW_INTERNAL_SIGNIN_WEB_VIEW_ACCOUNT_FETCHER_SERVICE_FACTORY_H_
diff --git a/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.mm b/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.mm
deleted file mode 100644
index 815310e..0000000
--- a/ios/web_view/internal/signin/web_view_account_fetcher_service_factory.mm
+++ /dev/null
@@ -1,70 +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.
-
-#include "ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h"
-
-#include <utility>
-
-#include "base/no_destructor.h"
-#include "components/image_fetcher/ios/ios_image_decoder_impl.h"
-#include "components/keyed_service/ios/browser_state_dependency_manager.h"
-#include "components/pref_registry/pref_registry_syncable.h"
-#include "components/signin/core/browser/account_fetcher_service.h"
-#include "components/signin/core/browser/profile_oauth2_token_service.h"
-#include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
-#include "ios/web_view/internal/signin/web_view_account_tracker_service_factory.h"
-#include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h"
-#include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
-#include "ios/web_view/internal/web_view_browser_state.h"
-
-#if !defined(__has_feature) || !__has_feature(objc_arc)
-#error "This file requires ARC support."
-#endif
-
-namespace ios_web_view {
-
-WebViewAccountFetcherServiceFactory::WebViewAccountFetcherServiceFactory()
-    : BrowserStateKeyedServiceFactory(
-          "AccountFetcherService",
-          BrowserStateDependencyManager::GetInstance()) {
-  DependsOn(WebViewAccountTrackerServiceFactory::GetInstance());
-  DependsOn(WebViewOAuth2TokenServiceFactory::GetInstance());
-  DependsOn(WebViewSigninClientFactory::GetInstance());
-}
-
-// static
-AccountFetcherService* WebViewAccountFetcherServiceFactory::GetForBrowserState(
-    ios_web_view::WebViewBrowserState* browser_state) {
-  return static_cast<AccountFetcherService*>(
-      GetInstance()->GetServiceForBrowserState(browser_state, true));
-}
-
-// static
-WebViewAccountFetcherServiceFactory*
-WebViewAccountFetcherServiceFactory::GetInstance() {
-  static base::NoDestructor<WebViewAccountFetcherServiceFactory> instance;
-  return instance.get();
-}
-
-void WebViewAccountFetcherServiceFactory::RegisterBrowserStatePrefs(
-    user_prefs::PrefRegistrySyncable* registry) {
-  AccountFetcherService::RegisterPrefs(registry);
-}
-
-std::unique_ptr<KeyedService>
-WebViewAccountFetcherServiceFactory::BuildServiceInstanceFor(
-    web::BrowserState* context) const {
-  WebViewBrowserState* browser_state =
-      WebViewBrowserState::FromBrowserState(context);
-  std::unique_ptr<AccountFetcherService> service =
-      std::make_unique<AccountFetcherService>();
-  service->Initialize(
-      WebViewSigninClientFactory::GetForBrowserState(browser_state),
-      WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
-      WebViewAccountTrackerServiceFactory::GetForBrowserState(browser_state),
-      image_fetcher::CreateIOSImageDecoder());
-  return service;
-}
-
-}  // namespace ios_web_view
diff --git a/ios/web_view/internal/signin/web_view_identity_manager_factory.mm b/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
index b85e611..493a8f0 100644
--- a/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
+++ b/ios/web_view/internal/signin/web_view_identity_manager_factory.mm
@@ -6,6 +6,7 @@
 
 #include <memory>
 
+#include "components/image_fetcher/ios/ios_image_decoder_impl.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/keyed_service/ios/browser_state_dependency_manager.h"
 #include "components/pref_registry/pref_registry_syncable.h"
@@ -15,7 +16,6 @@
 #include "components/signin/core/browser/signin_pref_names.h"
 #include "ios/web_view/internal/app/application_context.h"
 #include "ios/web_view/internal/signin/ios_web_view_signin_client.h"
-#include "ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h"
 #include "ios/web_view/internal/signin/web_view_account_tracker_service_factory.h"
 #include "ios/web_view/internal/signin/web_view_oauth2_token_service_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
@@ -33,6 +33,18 @@
 namespace ios_web_view {
 
 namespace {
+
+std::unique_ptr<AccountFetcherService> BuildAccountFetcherService(
+    SigninClient* signin_client,
+    OAuth2TokenService* token_service,
+    AccountTrackerService* account_tracker_service) {
+  auto account_fetcher_service = std::make_unique<AccountFetcherService>();
+  account_fetcher_service->Initialize(signin_client, token_service,
+                                      account_tracker_service,
+                                      image_fetcher::CreateIOSImageDecoder());
+  return account_fetcher_service;
+}
+
 std::unique_ptr<SigninManager> BuildSigninManager(
     WebViewBrowserState* browser_state,
     GaiaCookieManagerService* gaia_cookie_manager_service) {
@@ -66,6 +78,7 @@
   explicit IdentityManagerWrapper(
       std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service,
       std::unique_ptr<SigninManagerBase> signin_manager,
+      std::unique_ptr<AccountFetcherService> account_fetcher_service,
       std::unique_ptr<identity::PrimaryAccountMutator> primary_account_mutator,
       std::unique_ptr<identity::AccountsCookieMutatorImpl>
           accounts_cookie_mutator,
@@ -74,9 +87,8 @@
       : identity::IdentityManager(
             std::move(gaia_cookie_manager_service),
             std::move(signin_manager),
+            std::move(account_fetcher_service),
             WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
-            WebViewAccountFetcherServiceFactory::GetForBrowserState(
-                browser_state),
             WebViewAccountTrackerServiceFactory::GetForBrowserState(
                 browser_state),
             std::move(primary_account_mutator),
@@ -97,7 +109,6 @@
     : BrowserStateKeyedServiceFactory(
           "IdentityManager",
           BrowserStateDependencyManager::GetInstance()) {
-  DependsOn(WebViewAccountFetcherServiceFactory::GetInstance());
   DependsOn(WebViewAccountTrackerServiceFactory::GetInstance());
   DependsOn(WebViewOAuth2TokenServiceFactory::GetInstance());
   DependsOn(WebViewSigninClientFactory::GetInstance());
@@ -150,10 +161,17 @@
       std::make_unique<identity::DiagnosticsProviderImpl>(
           WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
           gaia_cookie_manager_service.get());
+  std::unique_ptr<AccountFetcherService> account_fetcher_service =
+      BuildAccountFetcherService(
+          WebViewSigninClientFactory::GetForBrowserState(browser_state),
+          WebViewOAuth2TokenServiceFactory::GetForBrowserState(browser_state),
+          WebViewAccountTrackerServiceFactory::GetForBrowserState(
+              browser_state));
   auto identity_manager = std::make_unique<IdentityManagerWrapper>(
       std::move(gaia_cookie_manager_service), std::move(signin_manager),
-      std::move(primary_account_mutator), std::move(accounts_cookie_mutator),
-      std::move(diagnostics_provider), browser_state);
+      std::move(account_fetcher_service), std::move(primary_account_mutator),
+      std::move(accounts_cookie_mutator), std::move(diagnostics_provider),
+      browser_state);
   return identity_manager;
 }
 
diff --git a/ios/web_view/internal/web_view_browser_state.mm b/ios/web_view/internal/web_view_browser_state.mm
index 365c8e38..1899c00 100644
--- a/ios/web_view/internal/web_view_browser_state.mm
+++ b/ios/web_view/internal/web_view_browser_state.mm
@@ -39,7 +39,6 @@
 #include "ios/web_view/internal/language/web_view_url_language_histogram_factory.h"
 #import "ios/web_view/internal/passwords/web_view_password_manager_internals_service_factory.h"
 #include "ios/web_view/internal/passwords/web_view_password_store_factory.h"
-#include "ios/web_view/internal/signin/web_view_account_fetcher_service_factory.h"
 #include "ios/web_view/internal/signin/web_view_identity_manager_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_client_factory.h"
 #include "ios/web_view/internal/signin/web_view_signin_error_controller_factory.h"
@@ -199,7 +198,6 @@
 #if BUILDFLAG(IOS_WEB_VIEW_ENABLE_SYNC)
   WebViewCookieSettingsFactory::GetInstance();
   WebViewHostContentSettingsMapFactory::GetInstance();
-  WebViewAccountFetcherServiceFactory::GetInstance();
   WebViewSigninClientFactory::GetInstance();
   WebViewSigninErrorControllerFactory::GetInstance();
   WebViewIdentityManagerFactory::EnsureFactoryAndDependeeFactoriesBuilt();
diff --git a/net/base/network_change_notifier.cc b/net/base/network_change_notifier.cc
index 265f752..a3112de 100644
--- a/net/base/network_change_notifier.cc
+++ b/net/base/network_change_notifier.cc
@@ -207,7 +207,7 @@
   CHECK(false);
   return NULL;
 #elif defined(OS_CHROMEOS)
-  return new NetworkChangeNotifierPosix(CONNECTION_NONE, SUBTYPE_NONE);
+  return new NetworkChangeNotifierPosix(CONNECTION_UNKNOWN, SUBTYPE_UNKNOWN);
 #elif defined(OS_LINUX)
   return new NetworkChangeNotifierLinux(std::unordered_set<std::string>());
 #elif defined(OS_MACOSX)
diff --git a/net/data/websocket/README b/net/data/websocket/README
index 515601e..ef9d896 100644
--- a/net/data/websocket/README
+++ b/net/data/websocket/README
@@ -47,9 +47,6 @@
      Used by kinds of PPAPI tests for WebSocket, ExtensionApiTest.WebSocket,
      and WorkerTest.WebSocketSharedWorker.
 
-- close-immediately_wsh.py : A WebSocket URL handler that performs an immediate
-     clean close as soon as the connection is established.
-
 - close_wsh.py : A WebSocket URL handler for testing outgoing close code and
      reason.
      Used by kinds of PPAPI tests for WebSocket.
diff --git a/net/data/websocket/close-immediately_wsh.py b/net/data/websocket/close-immediately_wsh.py
deleted file mode 100644
index 6cc08424..0000000
--- a/net/data/websocket/close-immediately_wsh.py
+++ /dev/null
@@ -1,11 +0,0 @@
-# Copyright (c) 2012 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.
-
-
-def web_socket_do_extra_handshake(_request):
-  pass  # Always accept.
-
-
-def web_socket_transfer_data(_request):
-  pass  # Close immediately
diff --git a/services/identity/public/cpp/identity_manager.cc b/services/identity/public/cpp/identity_manager.cc
index e1792a1d..b105e27 100644
--- a/services/identity/public/cpp/identity_manager.cc
+++ b/services/identity/public/cpp/identity_manager.cc
@@ -42,8 +42,8 @@
 IdentityManager::IdentityManager(
     std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service,
     std::unique_ptr<SigninManagerBase> signin_manager,
+    std::unique_ptr<AccountFetcherService> account_fetcher_service,
     ProfileOAuth2TokenService* token_service,
-    AccountFetcherService* account_fetcher_service,
     AccountTrackerService* account_tracker_service,
     std::unique_ptr<PrimaryAccountMutator> primary_account_mutator,
     std::unique_ptr<AccountsMutator> accounts_mutator,
@@ -51,8 +51,8 @@
     std::unique_ptr<DiagnosticsProvider> diagnostics_provider)
     : gaia_cookie_manager_service_(std::move(gaia_cookie_manager_service)),
       signin_manager_(std::move(signin_manager)),
+      account_fetcher_service_(std::move(account_fetcher_service)),
       token_service_(token_service),
-      account_fetcher_service_(account_fetcher_service),
       account_tracker_service_(account_tracker_service),
       primary_account_mutator_(std::move(primary_account_mutator)),
       accounts_mutator_(std::move(accounts_mutator)),
@@ -278,6 +278,7 @@
 // static
 void IdentityManager::RegisterProfilePrefs(PrefRegistrySimple* registry) {
   SigninManagerBase::RegisterProfilePrefs(registry);
+  AccountFetcherService::RegisterPrefs(registry);
 }
 
 std::string IdentityManager::PickAccountIdForAccount(
@@ -392,6 +393,7 @@
 }
 
 void IdentityManager::Shutdown() {
+  account_fetcher_service_->Shutdown();
   gaia_cookie_manager_service_->Shutdown();
 }
 
@@ -408,7 +410,7 @@
 }
 
 AccountFetcherService* IdentityManager::GetAccountFetcherService() {
-  return account_fetcher_service_;
+  return account_fetcher_service_.get();
 }
 
 GaiaCookieManagerService* IdentityManager::GetGaiaCookieManagerService() {
diff --git a/services/identity/public/cpp/identity_manager.h b/services/identity/public/cpp/identity_manager.h
index aaa280c67..a8109f7 100644
--- a/services/identity/public/cpp/identity_manager.h
+++ b/services/identity/public/cpp/identity_manager.h
@@ -200,8 +200,8 @@
   IdentityManager(
       std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service,
       std::unique_ptr<SigninManagerBase> signin_manager,
+      std::unique_ptr<AccountFetcherService> account_fetcher_service,
       ProfileOAuth2TokenService* token_service,
-      AccountFetcherService* account_fetcher_service,
       AccountTrackerService* account_tracker_service,
       std::unique_ptr<PrimaryAccountMutator> primary_account_mutator,
       std::unique_ptr<AccountsMutator> accounts_mutator,
@@ -472,7 +472,7 @@
   void AddDiagnosticsObserver(DiagnosticsObserver* observer);
   void RemoveDiagnosticsObserver(DiagnosticsObserver* observer);
 
- protected:
+  // Shut down IdentityManager and its owned dependencies.
   void Shutdown();
 
  private:
@@ -580,6 +580,8 @@
   FRIEND_TEST_ALL_PREFIXES(IdentityManagerTest,
                            CallbackSentOnAccountsCookieDeletedByUserAction);
   FRIEND_TEST_ALL_PREFIXES(IdentityManagerTest, OnNetworkInitialized);
+  FRIEND_TEST_ALL_PREFIXES(IdentityManagerTest,
+                           ForceRefreshOfExtendedAccountInfo);
 
   // Private getters used for testing only (i.e. see identity_test_utils.h).
   SigninManagerBase* GetSigninManager();
@@ -649,10 +651,9 @@
   // backed by the Identity Service.
   std::unique_ptr<GaiaCookieManagerService> gaia_cookie_manager_service_;
   std::unique_ptr<SigninManagerBase> signin_manager_;
+  std::unique_ptr<AccountFetcherService> account_fetcher_service_;
   ProfileOAuth2TokenService* token_service_;
-  AccountFetcherService* account_fetcher_service_;
   AccountTrackerService* account_tracker_service_;
-
   // PrimaryAccountMutator instance. May be null if mutation of the primary
   // account state is not supported on the current platform.
   std::unique_ptr<PrimaryAccountMutator> primary_account_mutator_;
diff --git a/services/identity/public/cpp/identity_manager_unittest.cc b/services/identity/public/cpp/identity_manager_unittest.cc
index 7c0032a..21cb5ac 100644
--- a/services/identity/public/cpp/identity_manager_unittest.cc
+++ b/services/identity/public/cpp/identity_manager_unittest.cc
@@ -257,25 +257,20 @@
   IdentityManagerTest()
       : signin_client_(&pref_service_), token_service_(&pref_service_) {
     AccountTrackerService::RegisterPrefs(pref_service_.registry());
-    AccountFetcherService::RegisterPrefs(pref_service_.registry());
     ProfileOAuth2TokenService::RegisterProfilePrefs(pref_service_.registry());
     IdentityManager::RegisterProfilePrefs(pref_service_.registry());
     IdentityManager::RegisterLocalStatePrefs(pref_service_.registry());
 
     account_tracker_.Initialize(&pref_service_, base::FilePath());
-    account_fetcher_.Initialize(
-        &signin_client_, &token_service_, &account_tracker_,
-        std::make_unique<image_fetcher::FakeImageDecoder>());
-
     RecreateIdentityManager(signin::AccountConsistencyMethod::kDisabled,
                             SigninManagerSetup::kWithAuthenticatedAccout);
   }
 
   ~IdentityManagerTest() override {
+    identity_manager_->Shutdown();
     signin_client_.Shutdown();
     token_service_.Shutdown();
     account_tracker_.Shutdown();
-    account_fetcher_.Shutdown();
   }
 
   void SetUp() override {
@@ -296,7 +291,6 @@
 
   AccountTrackerService* account_tracker() { return &account_tracker_; }
 
-  AccountFetcherService* account_fetcher() { return &account_fetcher_; }
   CustomFakeProfileOAuth2TokenService* token_service() {
     return &token_service_;
   }
@@ -326,6 +320,9 @@
     // trigger a DCHECK because there are still living observers.
     identity_manager_observer_.reset();
     identity_manager_diagnostics_observer_.reset();
+    if (identity_manager_) {
+      identity_manager_->Shutdown();
+    }
     identity_manager_.reset();
 
     auto gaia_cookie_manager_service =
@@ -338,6 +335,11 @@
                 },
                 test_url_loader_factory()));
 
+    auto account_fetcher_service = std::make_unique<AccountFetcherService>();
+    account_fetcher_service->Initialize(
+        &signin_client_, &token_service_, &account_tracker_,
+        std::make_unique<image_fetcher::FakeImageDecoder>());
+
 #if defined(OS_CHROMEOS)
     DCHECK_EQ(account_consistency, signin::AccountConsistencyMethod::kDisabled)
         << "AccountConsistency is not used by SigninManagerBase";
@@ -369,8 +371,9 @@
 
     identity_manager_.reset(new IdentityManager(
         std::move(gaia_cookie_manager_service), std::move(signin_manager),
-        &token_service_, &account_fetcher_, &account_tracker_, nullptr, nullptr,
-        std::move(accounts_cookie_mutator), std::move(diagnostics_provider)));
+        std::move(account_fetcher_service), &token_service_, &account_tracker_,
+        nullptr, nullptr, std::move(accounts_cookie_mutator),
+        std::move(diagnostics_provider)));
     identity_manager_observer_.reset(
         new TestIdentityManagerObserver(identity_manager_.get()));
     identity_manager_diagnostics_observer_.reset(
@@ -412,7 +415,6 @@
   base::MessageLoop message_loop_;
   sync_preferences::TestingPrefServiceSyncable pref_service_;
   AccountTrackerService account_tracker_;
-  AccountFetcherService account_fetcher_;
   TestSigninClient signin_client_;
   CustomFakeProfileOAuth2TokenService token_service_;
   network::TestURLLoaderFactory test_url_loader_factory_;
@@ -2347,10 +2349,9 @@
   // avoid a crash.
   ChildAccountInfoFetcherAndroid::InitializeForTests();
 
-  account_fetcher()->OnNetworkInitialized();
+  identity_manager()->GetAccountFetcherService()->OnNetworkInitialized();
   AccountInfo account_info =
       MakeAccountAvailable(identity_manager(), kTestEmail2);
-
   identity_manager()->ForceRefreshOfExtendedAccountInfo(
       account_info.account_id);
 
diff --git a/services/identity/public/cpp/identity_test_environment.cc b/services/identity/public/cpp/identity_test_environment.cc
index a2350d0..83a9075b1 100644
--- a/services/identity/public/cpp/identity_test_environment.cc
+++ b/services/identity/public/cpp/identity_test_environment.cc
@@ -140,11 +140,10 @@
       dependencies_owner_->pref_service();
 
   AccountTrackerService::RegisterPrefs(test_pref_service->registry());
-  AccountFetcherService::RegisterPrefs(test_pref_service->registry());
   ProfileOAuth2TokenService::RegisterProfilePrefs(
       test_pref_service->registry());
-  SigninManagerBase::RegisterProfilePrefs(test_pref_service->registry());
-  SigninManagerBase::RegisterPrefs(test_pref_service->registry());
+  IdentityManager::RegisterProfilePrefs(test_pref_service->registry());
+  IdentityManager::RegisterLocalStatePrefs(test_pref_service->registry());
 
   owned_token_service_ =
       std::make_unique<FakeProfileOAuth2TokenService>(test_pref_service);
@@ -153,8 +152,8 @@
   owned_account_tracker_service_->Initialize(test_pref_service,
                                              base::FilePath());
 
-  owned_account_fetcher_service_ = std::make_unique<AccountFetcherService>();
-  owned_account_fetcher_service_->Initialize(
+  auto account_fetcher_service = std::make_unique<AccountFetcherService>();
+  account_fetcher_service->Initialize(
       test_signin_client, owned_token_service_.get(),
       owned_account_tracker_service_.get(),
       std::make_unique<image_fetcher::FakeImageDecoder>());
@@ -212,7 +211,7 @@
 
   owned_identity_manager_ = std::make_unique<IdentityManager>(
       std::move(gaia_cookie_manager_service), std::move(signin_manager),
-      owned_token_service_.get(), owned_account_fetcher_service_.get(),
+      std::move(account_fetcher_service), owned_token_service_.get(),
       owned_account_tracker_service_.get(), std::move(primary_account_mutator),
       std::move(accounts_mutator), std::move(accounts_cookie_mutator),
       std::move(diagnostics_provider));
@@ -221,10 +220,6 @@
 }
 
 IdentityTestEnvironment::~IdentityTestEnvironment() {
-  if (owned_account_fetcher_service_) {
-    owned_account_fetcher_service_->Shutdown();
-  }
-
   if (owned_account_tracker_service_) {
     owned_account_tracker_service_->Shutdown();
   }
diff --git a/services/identity/public/cpp/identity_test_environment.h b/services/identity/public/cpp/identity_test_environment.h
index 61a7f71..2c59e3a86 100644
--- a/services/identity/public/cpp/identity_test_environment.h
+++ b/services/identity/public/cpp/identity_test_environment.h
@@ -10,7 +10,6 @@
 #include "services/identity/public/cpp/identity_manager.h"
 #include "services/identity/public/cpp/identity_test_utils.h"
 
-class AccountFetcherService;
 class AccountTrackerService;
 class FakeProfileOAuth2TokenService;
 class IdentityTestEnvironmentChromeBrowserStateAdaptor;
@@ -338,10 +337,6 @@
   // IdentityTestEnvironment's constructor.
   std::unique_ptr<AccountTrackerService> owned_account_tracker_service_;
 
-  // This will be null if a AccountFetcherService was provided to
-  // IdentityTestEnvironment's constructor.
-  std::unique_ptr<AccountFetcherService> owned_account_fetcher_service_;
-
   // This will be null if a FakeProfileOAuth2TokenService was provided to
   // IdentityTestEnvironment's constructor.
   std::unique_ptr<FakeProfileOAuth2TokenService> owned_token_service_;
diff --git a/services/viz/public/cpp/compositing/render_pass.typemap b/services/viz/public/cpp/compositing/render_pass.typemap
index a16f1583..4996028 100644
--- a/services/viz/public/cpp/compositing/render_pass.typemap
+++ b/services/viz/public/cpp/compositing/render_pass.typemap
@@ -16,6 +16,9 @@
   "//services/viz/public/cpp/compositing/quads_struct_traits.cc",
   "//services/viz/public/cpp/compositing/render_pass_struct_traits.cc",
 ]
+deps = [
+  "//ui/gl",
+]
 type_mappings = [
   "viz.mojom.RenderPass=std::unique_ptr<viz::RenderPass>[move_only,nullable_is_same_type]",
   "viz::mojom::ProtectedVideoState=ui::ProtectedVideoType",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index e099f16c..51d91fb1 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -5822,6 +5822,23 @@
             ]
         }
     ],
+    "WebRTC-Bwe-LossBasedControl": [
+        {
+            "platforms": [
+                "windows",
+                "mac",
+                "chromeos",
+                "linux",
+                "ios",
+                "android_webview"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled,balance_incr:5kbps,balance_decr:24kbps,exponent:0.7,resets:true"
+                }
+            ]
+        }
+    ],
     "WebRTC-EnableWebRtcEcdsa": [
         {
             "platforms": [
diff --git a/third_party/blink/common/feature_policy/feature_policy.cc b/third_party/blink/common/feature_policy/feature_policy.cc
index 916cd14..a22cc83 100644
--- a/third_party/blink/common/feature_policy/feature_policy.cc
+++ b/third_party/blink/common/feature_policy/feature_policy.cc
@@ -438,9 +438,6 @@
        {mojom::FeaturePolicyFeature::kTopNavigation,
         FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
                             mojom::PolicyValueType::kBool)},
-       {mojom::FeaturePolicyFeature::kUnoptimizedLosslessImages,
-        FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
-                            mojom::PolicyValueType::kDecDouble)},
        {mojom::FeaturePolicyFeature::kUnoptimizedLossyImages,
         FeatureDefaultValue(FeaturePolicy::FeatureDefault::EnableForAll,
                             mojom::PolicyValueType::kDecDouble)},
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 5e68d5b31..89860c2 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -30,6 +30,10 @@
 const base::Feature kScriptStreaming{"ScriptStreaming",
                                      base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Enables user level memory pressure signal generation on Android.
+const base::Feature kUserLevelMemoryPressureSignal{
+    "UserLevelMemoryPressureSignal", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enable FCP++ by experiment. See https://crbug.com/869924
 const base::Feature kFirstContentfulPaintPlusPlus{
     "FirstContentfulPaintPlusPlus", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/BUILD.gn b/third_party/blink/public/BUILD.gn
index 1c6b8a32..f099def2 100644
--- a/third_party/blink/public/BUILD.gn
+++ b/third_party/blink/public/BUILD.gn
@@ -563,6 +563,7 @@
     "//services/network/public/cpp:cpp",
     "//services/network/public/mojom",
     "//third_party/webrtc/api:libjingle_peerconnection_api",
+    "//third_party/webrtc/api:rtc_stats_api",
     "//third_party/webrtc/media:rtc_media_base",
     "//third_party/webrtc/modules/audio_processing:api",
     "//third_party/webrtc/rtc_base:rtc_base",
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index 15b065e2..0334cb6 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -17,6 +17,7 @@
 BLINK_COMMON_EXPORT extern const base::Feature
     kEnableGpuRasterizationViewportRestriction;
 BLINK_COMMON_EXPORT extern const base::Feature kScriptStreaming;
+BLINK_COMMON_EXPORT extern const base::Feature kUserLevelMemoryPressureSignal;
 BLINK_COMMON_EXPORT extern const base::Feature kFirstContentfulPaintPlusPlus;
 BLINK_COMMON_EXPORT extern const base::Feature kFreezePurgeMemoryAllPagesFrozen;
 BLINK_COMMON_EXPORT extern const base::Feature kImplicitRootScroller;
diff --git a/third_party/blink/public/mojom/feature_policy/feature_policy.mojom b/third_party/blink/public/mojom/feature_policy/feature_policy.mojom
index 41a1a86..b5aa3fb 100644
--- a/third_party/blink/public/mojom/feature_policy/feature_policy.mojom
+++ b/third_party/blink/public/mojom/feature_policy/feature_policy.mojom
@@ -123,7 +123,6 @@
 
   // When disallowed, these policies require images to have a reasonable byte-to-pixel ratio.
   kUnoptimizedLossyImages = 45,
-  kUnoptimizedLosslessImages = 46,
 
   // Don't change assigned numbers of any item, and don't reuse removed slots.
   // Add new features at the end of the enum.
diff --git a/third_party/blink/public/platform/web_layer_tree_view.h b/third_party/blink/public/platform/web_layer_tree_view.h
index 93b851b..22e0fa9 100644
--- a/third_party/blink/public/platform/web_layer_tree_view.h
+++ b/third_party/blink/public/platform/web_layer_tree_view.h
@@ -41,6 +41,10 @@
 #include "third_party/skia/include/core/SkImage.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 
+namespace cc {
+class PaintImage;
+}
+
 namespace blink {
 
 class WebLayerTreeView {
@@ -135,6 +139,14 @@
   virtual void NotifySwapTime(ReportTimeCallback callback) {}
 
   virtual void RequestBeginMainFrameNotExpected(bool new_state) {}
+
+  virtual void RequestDecode(const cc::PaintImage& image,
+                             base::OnceCallback<void(bool)> callback) {}
+
+  // Runs |callback| after a new frame has been submitted to the display
+  // compositor, and the display-compositor has displayed it on screen. Forces a
+  // redraw so that a new frame is submitted.
+  virtual void RequestPresentationCallback(base::OnceClosure callback) {}
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/platform/web_rtc_peer_connection_handler.h b/third_party/blink/public/platform/web_rtc_peer_connection_handler.h
index 24f46a8..1d504b0 100644
--- a/third_party/blink/public/platform/web_rtc_peer_connection_handler.h
+++ b/third_party/blink/public/platform/web_rtc_peer_connection_handler.h
@@ -42,6 +42,7 @@
 #include "third_party/webrtc/api/peer_connection_interface.h"
 #include "third_party/webrtc/api/rtc_error.h"
 #include "third_party/webrtc/api/rtp_transceiver_interface.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace webrtc {
 enum class RTCErrorType;
@@ -114,7 +115,7 @@
   // third_party/webrtc/api/stats/.  These will replace the old stats collection
   // API when the new API has matured enough.
   virtual void GetStats(std::unique_ptr<WebRTCStatsReportCallback>,
-                        RTCStatsFilter) = 0;
+                        const std::vector<webrtc::NonStandardGroupId>&) = 0;
   virtual scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(
       const WebString& label,
       const WebRTCDataChannelInit&) = 0;
diff --git a/third_party/blink/public/platform/web_rtc_rtp_receiver.h b/third_party/blink/public/platform/web_rtc_rtp_receiver.h
index 0307271..6ee61ed3 100644
--- a/third_party/blink/public/platform/web_rtc_rtp_receiver.h
+++ b/third_party/blink/public/platform/web_rtc_rtp_receiver.h
@@ -6,12 +6,14 @@
 #define THIRD_PARTY_BLINK_PUBLIC_PLATFORM_WEB_RTC_RTP_RECEIVER_H_
 
 #include <memory>
+#include <vector>
 #include "third_party/blink/public/platform/web_common.h"
 #include "third_party/blink/public/platform/web_rtc_stats.h"
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/blink/public/platform/web_vector.h"
 #include "third_party/webrtc/api/dtls_transport_interface.h"
 #include "third_party/webrtc/api/rtp_parameters.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 
@@ -39,7 +41,7 @@
   virtual WebVector<WebString> StreamIds() const = 0;
   virtual WebVector<std::unique_ptr<WebRTCRtpSource>> GetSources() = 0;
   virtual void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                        RTCStatsFilter) = 0;
+                        const std::vector<webrtc::NonStandardGroupId>&) = 0;
   virtual std::unique_ptr<webrtc::RtpParameters> GetParameters() const = 0;
 };
 
diff --git a/third_party/blink/public/platform/web_rtc_rtp_sender.h b/third_party/blink/public/platform/web_rtc_rtp_sender.h
index 4b17890..f873f5d 100644
--- a/third_party/blink/public/platform/web_rtc_rtp_sender.h
+++ b/third_party/blink/public/platform/web_rtc_rtp_sender.h
@@ -11,6 +11,7 @@
 #include "third_party/blink/public/platform/web_string.h"
 #include "third_party/webrtc/api/dtls_transport_interface.h"
 #include "third_party/webrtc/api/rtp_parameters.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 
@@ -47,7 +48,7 @@
                              webrtc::DegradationPreference,
                              WebRTCVoidRequest) = 0;
   virtual void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                        RTCStatsFilter) = 0;
+                        const std::vector<webrtc::NonStandardGroupId>&) = 0;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/platform/web_rtc_stats.h b/third_party/blink/public/platform/web_rtc_stats.h
index abbd62d..d41f8b2 100644
--- a/third_party/blink/public/platform/web_rtc_stats.h
+++ b/third_party/blink/public/platform/web_rtc_stats.h
@@ -34,11 +34,6 @@
   kWebRTCStatsMemberTypeSequenceString,  // WebVector<WebString>
 };
 
-enum class RTCStatsFilter {
-  kIncludeOnlyStandardMembers,
-  kIncludeNonStandardMembers,
-};
-
 class BLINK_PLATFORM_EXPORT WebRTCStatsReport {
  public:
   virtual ~WebRTCStatsReport();
diff --git a/third_party/blink/public/platform/web_runtime_features.h b/third_party/blink/public/platform/web_runtime_features.h
index a2c906a..3c33935 100644
--- a/third_party/blink/public/platform/web_runtime_features.h
+++ b/third_party/blink/public/platform/web_runtime_features.h
@@ -83,8 +83,6 @@
   BLINK_PLATFORM_EXPORT static void EnableAudioOutputDevices(bool);
   BLINK_PLATFORM_EXPORT static void EnableBackgroundFetch(bool);
   BLINK_PLATFORM_EXPORT static void EnableBlinkHeapIncrementalMarking(bool);
-  BLINK_PLATFORM_EXPORT static void EnableBlinkHeapUnifiedGarbageCollection(
-      bool);
   BLINK_PLATFORM_EXPORT static void EnableBloatedRendererDetection(bool);
   BLINK_PLATFORM_EXPORT static void EnableCacheInlineScriptCode(bool);
   BLINK_PLATFORM_EXPORT static void EnableIsolatedCodeCache(bool);
diff --git a/third_party/blink/public/web/modules/mediastream/OWNERS b/third_party/blink/public/web/modules/mediastream/OWNERS
new file mode 100644
index 0000000..4d93338
--- /dev/null
+++ b/third_party/blink/public/web/modules/mediastream/OWNERS
@@ -0,0 +1,4 @@
+file://third_party/blink/common/mediastream/OWNERS
+
+# TEAM: media-capture-and-streams@grotations.appspotmail.com
+# COMPONENT: Blink>GetUserMedia
diff --git a/third_party/blink/public/web/web_widget.h b/third_party/blink/public/web/web_widget.h
index 3166b8bf..cc22795 100644
--- a/third_party/blink/public/web/web_widget.h
+++ b/third_party/blink/public/web/web_widget.h
@@ -154,6 +154,12 @@
   // transormations (e.g. pinch-zoom, dev tools emulation, etc.).
   virtual void PaintContent(cc::PaintCanvas*, const WebRect& view_port) {}
 
+  // Runs |callback| after a new frame has been submitted to the display
+  // compositor, and the display-compositor has displayed it on screen. Forces a
+  // redraw so that a new frame is submitted.
+  virtual void RequestPresentationCallbackForTesting(
+      base::OnceClosure callback) {}
+
   // Called to inform the WebWidget of a change in theme.
   // Implementors that cache rendered copies of widgets need to re-render
   // on receiving this message
diff --git a/third_party/blink/public/web/web_widget_client.h b/third_party/blink/public/web/web_widget_client.h
index 362ed035..2a2e5cb 100644
--- a/third_party/blink/public/web/web_widget_client.h
+++ b/third_party/blink/public/web/web_widget_client.h
@@ -50,7 +50,6 @@
 class SkBitmap;
 
 namespace cc {
-class PaintImage;
 struct ViewportLayers;
 }
 
@@ -250,12 +249,6 @@
                                        bool use_anchor,
                                        float new_page_scale,
                                        double duration_sec) {}
-
-  // Requests an image decode and will have the |callback| run asynchronously
-  // when it completes. Forces a new main frame to occur that will trigger
-  // pushing the decode through the compositor.
-  virtual void RequestDecode(const cc::PaintImage& image,
-                             base::OnceCallback<void(bool)> callback) {}
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/bindings/bindings.gni b/third_party/blink/renderer/bindings/bindings.gni
index 21b6364..b36a029 100644
--- a/third_party/blink/renderer/bindings/bindings.gni
+++ b/third_party/blink/renderer/bindings/bindings.gni
@@ -198,7 +198,6 @@
           "core/v8/script_promise_resolver_test.cc",
           "core/v8/script_promise_test.cc",
           "core/v8/script_streamer_test.cc",
-          "core/v8/script_wrappable_marking_visitor_test.cc",
           "core/v8/script_wrappable_v8_gc_integration_test.cc",
           "core/v8/script_wrappable_visitor_test.cc",
           "core/v8/to_v8_test.cc",
diff --git a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc b/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
deleted file mode 100644
index 40d0791..0000000
--- a/third_party/blink/renderer/bindings/core/v8/script_wrappable_marking_visitor_test.cc
+++ /dev/null
@@ -1,520 +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.
-
-#include "third_party/blink/renderer/platform/bindings/script_wrappable_marking_visitor.h"
-
-#include "base/macros.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/blink/renderer/bindings/core/v8/to_v8_for_core.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h"
-#include "third_party/blink/renderer/bindings/core/v8/v8_gc_controller.h"
-#include "third_party/blink/renderer/core/testing/death_aware_script_wrappable.h"
-#include "third_party/blink/renderer/platform/bindings/name_client.h"
-#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
-#include "third_party/blink/renderer/platform/bindings/v8_dom_wrapper.h"
-#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
-
-namespace blink {
-
-namespace {
-
-// Temporarily swaps out the underlying ScriptWrappableMarkingVisitor from a
-// given v8::Isolate. Gracefully finalized potentially running garbage
-// collections.
-class TemporaryScriptWrappableVisitorScope {
-  STACK_ALLOCATED();
-
- public:
-  TemporaryScriptWrappableVisitorScope(
-      v8::Isolate* isolate,
-      std::unique_ptr<ScriptWrappableMarkingVisitor> controller)
-      : isolate_(isolate), saved_controller_(std::move(controller)) {
-    // The save and restore logic assumes that V8 is interested in the
-    // wrapper tracing controller.
-    CHECK(!RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled());
-    SwapWithV8PerIsolateDataVisitor();
-  }
-  ~TemporaryScriptWrappableVisitorScope() { SwapWithV8PerIsolateDataVisitor(); }
-
-  ScriptWrappableMarkingVisitor* CurrentVisitor() {
-    return V8PerIsolateData::From(isolate_)->GetScriptWrappableMarkingVisitor();
-  }
-
- private:
-  void SwapWithV8PerIsolateDataVisitor() {
-    ScriptWrappableMarkingVisitor* current = CurrentVisitor();
-    if (current)
-      ScriptWrappableMarkingVisitor::PerformCleanup(isolate_);
-
-    V8PerIsolateData::From(isolate_)->SwapScriptWrappableMarkingVisitor(
-        saved_controller_);
-    isolate_->SetEmbedderHeapTracer(CurrentVisitor());
-  }
-
-  v8::Isolate* const isolate_;
-  std::unique_ptr<ScriptWrappableMarkingVisitor> saved_controller_;
-
-  DISALLOW_COPY_AND_ASSIGN(TemporaryScriptWrappableVisitorScope);
-};
-
-class InterceptingScriptWrappableMarkingVisitor
-    : public blink::ScriptWrappableMarkingVisitor {
- public:
-  InterceptingScriptWrappableMarkingVisitor()
-      : ScriptWrappableMarkingVisitor(ThreadState::Current()),
-        marked_wrappers_(new size_t(0)) {}
-  ~InterceptingScriptWrappableMarkingVisitor() override {
-    delete marked_wrappers_;
-  }
-
-  void Visit(const TraceWrapperV8Reference<v8::Value>&) override {
-    *marked_wrappers_ += 1;
-    // Do not actually mark this visitor, as this would call into v8, which
-    // would require executing an actual GC.
-  }
-
-  size_t NumberOfMarkedWrappers() const { return *marked_wrappers_; }
-
-  void Start() { TracePrologue(); }
-
-  void end() {
-    // Gracefully terminate tracing.
-    AdvanceTracing(std::numeric_limits<double>::infinity());
-    AbortTracingForTermination();
-  }
-
- private:
-  size_t* marked_wrappers_;  // Indirection required because of const override.
-};
-
-class InterceptingScriptWrappableMarkingVisitorScope
-    : public TemporaryScriptWrappableVisitorScope {
-  STACK_ALLOCATED();
-
- public:
-  InterceptingScriptWrappableMarkingVisitorScope(v8::Isolate* isolate)
-      : TemporaryScriptWrappableVisitorScope(
-            isolate,
-            std::unique_ptr<InterceptingScriptWrappableMarkingVisitor>(
-                new InterceptingScriptWrappableMarkingVisitor())) {
-    Visitor()->Start();
-  }
-
-  virtual ~InterceptingScriptWrappableMarkingVisitorScope() {
-    Visitor()->end();
-  }
-
-  InterceptingScriptWrappableMarkingVisitor* Visitor() {
-    return reinterpret_cast<InterceptingScriptWrappableMarkingVisitor*>(
-        CurrentVisitor());
-  }
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(InterceptingScriptWrappableMarkingVisitorScope);
-};
-
-void PreciselyCollectGarbage() {
-  ThreadState::Current()->CollectAllGarbage();
-}
-
-}  // namespace
-
-// =============================================================================
-// Wrapper tracing tests for Blink handling. ===================================
-// =============================================================================
-
-TEST(ScriptWrappableMarkingVisitorTest,
-     ScriptWrappableMarkingVisitorTracesWrappers) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
-  DeathAwareScriptWrappable* dependency = DeathAwareScriptWrappable::Create();
-  target->SetWrappedDependency(dependency);
-
-  // The graph needs to be set up before starting tracing as otherwise the
-  // conservative write barrier would trigger.
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  HeapObjectHeader* target_header = HeapObjectHeader::FromPayload(target);
-  HeapObjectHeader* dependency_header =
-      HeapObjectHeader::FromPayload(dependency);
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-  EXPECT_FALSE(target_header->IsWrapperHeaderMarked());
-  EXPECT_FALSE(dependency_header->IsWrapperHeaderMarked());
-
-  std::pair<void*, void*> pair = std::make_pair(
-      const_cast<WrapperTypeInfo*>(target->GetWrapperTypeInfo()), target);
-  visitor->RegisterV8Reference(pair);
-  EXPECT_EQ(visitor->MarkingDeque()->size(), 1ul);
-
-  visitor->AdvanceTracing(std::numeric_limits<double>::infinity());
-  EXPECT_EQ(visitor->MarkingDeque()->size(), 0ul);
-  EXPECT_TRUE(target_header->IsWrapperHeaderMarked());
-  EXPECT_TRUE(dependency_header->IsWrapperHeaderMarked());
-}
-
-TEST(ScriptWrappableMarkingVisitorTest,
-     MarkedObjectDoesNothingOnWriteBarrierHitWhenDependencyIsMarkedToo) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
-  DeathAwareScriptWrappable* dependencies[] = {
-      DeathAwareScriptWrappable::Create(), DeathAwareScriptWrappable::Create(),
-      DeathAwareScriptWrappable::Create(), DeathAwareScriptWrappable::Create()};
-
-  HeapObjectHeader::FromPayload(target)->MarkWrapperHeader();
-  for (int i = 0; i < 4; i++) {
-    HeapObjectHeader::FromPayload(dependencies[i])->MarkWrapperHeader();
-  }
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-
-  target->SetWrappedDependency(dependencies[0]);
-  target->AddWrappedVectorDependency(dependencies[1]);
-  target->AddWrappedHashMapDependency(dependencies[2], dependencies[3]);
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-}
-
-TEST(ScriptWrappableMarkingVisitorTest,
-     MarkedObjectMarksDependencyOnWriteBarrierHitWhenNotMarked) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
-  DeathAwareScriptWrappable* dependencies[] = {
-      DeathAwareScriptWrappable::Create(), DeathAwareScriptWrappable::Create(),
-      DeathAwareScriptWrappable::Create(), DeathAwareScriptWrappable::Create()};
-
-  HeapObjectHeader::FromPayload(target)->MarkWrapperHeader();
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-
-  target->SetWrappedDependency(dependencies[0]);
-  target->AddWrappedVectorDependency(dependencies[1]);
-  target->AddWrappedHashMapDependency(dependencies[2], dependencies[3]);
-
-  for (int i = 0; i < 4; i++) {
-    EXPECT_TRUE(visitor->MarkingDequeContains(dependencies[i]));
-  }
-}
-
-namespace {
-
-class HandleContainer
-    : public blink::GarbageCollectedFinalized<HandleContainer> {
- public:
-  HandleContainer() = default;
-  virtual ~HandleContainer() = default;
-
-  void Trace(blink::Visitor* visitor) { visitor->Trace(handle_); }
-
-  void SetValue(v8::Isolate* isolate, v8::Local<v8::String> string) {
-    handle_.Set(isolate, string);
-  }
-
- private:
-  TraceWrapperV8Reference<v8::String> handle_;
-};
-
-}  // namespace
-
-TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnUnmarkedContainer) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-  InterceptingScriptWrappableMarkingVisitorScope visitor_scope(
-      scope.GetIsolate());
-  auto* raw_visitor = visitor_scope.Visitor();
-
-  v8::Local<v8::String> str =
-      v8::String::NewFromUtf8(scope.GetIsolate(), "teststring",
-                              v8::NewStringType::kNormal, sizeof("teststring"))
-          .ToLocalChecked();
-  auto* container = MakeGarbageCollected<HandleContainer>();
-  CHECK_EQ(0u, raw_visitor->NumberOfMarkedWrappers());
-  container->SetValue(scope.GetIsolate(), str);
-  // The write barrier is conservative and does not check the mark bits of the
-  // source container.
-  CHECK_EQ(1u, raw_visitor->NumberOfMarkedWrappers());
-}
-
-TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierTriggersOnMarkedContainer) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-  InterceptingScriptWrappableMarkingVisitorScope visitor_scope(
-      scope.GetIsolate());
-  auto* raw_visitor = visitor_scope.Visitor();
-
-  v8::Local<v8::String> str =
-      v8::String::NewFromUtf8(scope.GetIsolate(), "teststring",
-                              v8::NewStringType::kNormal, sizeof("teststring"))
-          .ToLocalChecked();
-  auto* container = MakeGarbageCollected<HandleContainer>();
-  HeapObjectHeader::FromPayload(container)->MarkWrapperHeader();
-  CHECK_EQ(0u, raw_visitor->NumberOfMarkedWrappers());
-  container->SetValue(scope.GetIsolate(), str);
-  CHECK_EQ(1u, raw_visitor->NumberOfMarkedWrappers());
-}
-
-TEST(ScriptWrappableMarkingVisitorTest, VtableAtObjectStart) {
-  // This test makes sure that the subobject v8::EmbedderHeapTracer is placed
-  // at the start of a ScriptWrappableMarkingVisitor object. We do this to
-  // mitigate potential problems that could be caused by LTO when passing
-  // v8::EmbedderHeapTracer across the API boundary.
-  std::unique_ptr<blink::ScriptWrappableMarkingVisitor> visitor(
-      new ScriptWrappableMarkingVisitor(ThreadState::Current()));
-  CHECK_EQ(
-      static_cast<void*>(visitor.get()),
-      static_cast<void*>(dynamic_cast<v8::EmbedderHeapTracer*>(visitor.get())));
-}
-
-TEST(ScriptWrappableMarkingVisitor, WriteBarrierForScriptWrappable) {
-  // Regression test for crbug.com/702490.
-
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-  InterceptingScriptWrappableMarkingVisitorScope visitor_scope(
-      scope.GetIsolate());
-  auto* raw_visitor = visitor_scope.Visitor();
-
-  // Mark the ScriptWrappable.
-  DeathAwareScriptWrappable* target = DeathAwareScriptWrappable::Create();
-  HeapObjectHeader::FromPayload(target)->MarkWrapperHeader();
-
-  // Create a 'wrapper' object.
-  v8::Local<v8::Object> wrapper = V8DOMWrapper::CreateWrapper(
-      scope.GetIsolate(), scope.GetContext()->Global(),
-      target->GetWrapperTypeInfo());
-
-  // Upon setting the wrapper we should have executed the write barrier.
-  CHECK_EQ(0u, raw_visitor->NumberOfMarkedWrappers());
-  v8::Local<v8::Object> final_wrapper =
-      V8DOMWrapper::AssociateObjectWithWrapper(
-          scope.GetIsolate(), target, target->GetWrapperTypeInfo(), wrapper);
-  CHECK(!final_wrapper.IsEmpty());
-  CHECK_EQ(1u, raw_visitor->NumberOfMarkedWrappers());
-}
-
-TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnHeapVectorSwap1) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  HeapVector<DeathAwareScriptWrappable::Wrapper> vector1;
-  DeathAwareScriptWrappable* entry1 = DeathAwareScriptWrappable::Create();
-  vector1.push_back(entry1);
-  HeapVector<DeathAwareScriptWrappable::Wrapper> vector2;
-  DeathAwareScriptWrappable* entry2 = DeathAwareScriptWrappable::Create();
-  vector2.push_back(entry2);
-
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-  swap(vector1, vector2);
-
-  EXPECT_TRUE(visitor->MarkingDequeContains(entry1));
-  EXPECT_TRUE(visitor->MarkingDequeContains(entry2));
-}
-
-TEST(ScriptWrappableMarkingVisitorTest, WriteBarrierOnHeapVectorSwap2) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  HeapVector<DeathAwareScriptWrappable::Wrapper> vector1;
-  DeathAwareScriptWrappable* entry1 = DeathAwareScriptWrappable::Create();
-  vector1.push_back(entry1);
-  HeapVector<Member<DeathAwareScriptWrappable>> vector2;
-  DeathAwareScriptWrappable* entry2 = DeathAwareScriptWrappable::Create();
-  vector2.push_back(entry2);
-
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-  swap(vector1, vector2);
-
-  // Only entry2 is held alive by TraceWrapperMember, so we only expect this
-  // barrier to fire.
-  EXPECT_TRUE(visitor->MarkingDequeContains(entry2));
-}
-
-namespace {
-
-class Mixin : public GarbageCollectedMixin {
- public:
-  explicit Mixin(DeathAwareScriptWrappable* wrapper_in_mixin)
-      : wrapper_in_mixin_(wrapper_in_mixin) {}
-
-  void Trace(Visitor* visitor) override { visitor->Trace(wrapper_in_mixin_); }
-
- protected:
-  DeathAwareScriptWrappable::Wrapper wrapper_in_mixin_;
-};
-
-class ClassWithField {
- protected:
-  int field_;
-};
-
-class Base : public blink::GarbageCollected<Base>,
-             public NameClient,  // Force vtable on Base.
-             public ClassWithField,
-             public Mixin {
-  USING_GARBAGE_COLLECTED_MIXIN(Base);
-
- public:
-  Base(DeathAwareScriptWrappable* wrapper_in_base,
-       DeathAwareScriptWrappable* wrapper_in_mixin)
-      : Mixin(wrapper_in_mixin), wrapper_in_base_(wrapper_in_base) {
-    // Use field_;
-    field_ = 0;
-  }
-
-  void Trace(Visitor* visitor) override {
-    visitor->Trace(wrapper_in_base_);
-    Mixin::Trace(visitor);
-  }
-
-  const char* NameInHeapSnapshot() const override { return "HandleContainer"; }
-
- protected:
-  DeathAwareScriptWrappable::Wrapper wrapper_in_base_;
-};
-
-}  // namespace
-
-TEST(ScriptWrappableMarkingVisitorTest, MixinTracing) {
-  // Test depends on InterceptingScriptWrappableMarkingVisitorScope which is
-  // specialized for wrapper tracing.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  DeathAwareScriptWrappable* base_wrapper = DeathAwareScriptWrappable::Create();
-  DeathAwareScriptWrappable* mixin_wrapper =
-      DeathAwareScriptWrappable::Create();
-  auto* base = MakeGarbageCollected<Base>(base_wrapper, mixin_wrapper);
-  Mixin* mixin = static_cast<Mixin*>(base);
-  HeapObjectHeader* base_header = HeapObjectHeader::FromPayload(base);
-  EXPECT_FALSE(base_header->IsWrapperHeaderMarked());
-
-  // Make sure that mixin does not point to the object header.
-  EXPECT_NE(static_cast<void*>(base), static_cast<void*>(mixin));
-
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  EXPECT_TRUE(visitor->MarkingDeque()->IsEmpty());
-
-  // TraceWrapperMember itself is not required to live in an Oilpan object.
-  TraceWrapperMember<Mixin> mixin_handle = mixin;
-  EXPECT_TRUE(base_header->IsWrapperHeaderMarked());
-  EXPECT_FALSE(visitor->MarkingDeque()->IsEmpty());
-  EXPECT_TRUE(visitor->MarkingDequeContains(base));
-
-  visitor->AdvanceTracing(std::numeric_limits<double>::infinity());
-  EXPECT_EQ(visitor->MarkingDeque()->size(), 0ul);
-  EXPECT_TRUE(base_header->IsWrapperHeaderMarked());
-  EXPECT_TRUE(
-      HeapObjectHeader::FromPayload(base_wrapper)->IsWrapperHeaderMarked());
-  EXPECT_TRUE(
-      HeapObjectHeader::FromPayload(mixin_wrapper)->IsWrapperHeaderMarked());
-
-  mixin_handle = nullptr;
-}
-
-TEST(ScriptWrappableMarkingVisitorTest, OilpanClearsHeadersWhenObjectDied) {
-  // This test depends on cleanup callbacks that are only fired when wrapper
-  // tracing is enabled.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  DeathAwareScriptWrappable* object = DeathAwareScriptWrappable::Create();
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-  auto* header = HeapObjectHeader::FromPayload(object);
-  visitor->headers_to_unmark_.push_back(header);
-  object = nullptr;
-
-  PreciselyCollectGarbage();
-
-  EXPECT_FALSE(visitor->headers_to_unmark_.Contains(header));
-}
-
-TEST(ScriptWrappableMarkingVisitorTest,
-     OilpanClearsMarkingDequeWhenObjectDied) {
-  // This test depends on cleanup callbacks that are only fired when wrapper
-  // tracing is enabled.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    return;
-
-  V8TestingScope scope;
-
-  DeathAwareScriptWrappable* object = DeathAwareScriptWrappable::Create();
-  InterceptingScriptWrappableMarkingVisitorScope intercepting_scope(
-      scope.GetIsolate());
-  ScriptWrappableMarkingVisitor* visitor = intercepting_scope.Visitor();
-
-  visitor->TraceWithWrappers(object);
-
-  EXPECT_EQ(visitor->MarkingDeque()->front().RawObjectPointer(), object);
-
-  PreciselyCollectGarbage();
-
-  EXPECT_EQ(visitor->MarkingDeque()->front().RawObjectPointer(), nullptr);
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
index 2960df8..d55dd9c 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_embedder_graph_builder.cc
@@ -439,8 +439,7 @@
   // Stage 3: find transitive closure of the unknown nodes.
   // Nodes reachable only via pending activities are treated as unknown.
   VisitPendingActivities();
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-    VisitBlinkRoots();
+  VisitBlinkRoots();
   while (!unknown_worklist_.empty()) {
     auto item = std::move(unknown_worklist_.back());
     unknown_worklist_.pop_back();
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
index 02783d6a..c3d04f0 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_gc_controller.cc
@@ -162,9 +162,7 @@
   stats_collector->IncreaseCollectedWrapperCount(count);
 }
 
-void ScheduleFollowupGCs(ThreadState* thread_state,
-                         v8::GCCallbackFlags flags,
-                         bool is_unified) {
+void ScheduleFollowupGCs(ThreadState* thread_state, v8::GCCallbackFlags flags) {
   DCHECK(!thread_state->IsGCForbidden());
   // Schedules followup garbage collections. Such garbage collections may be
   // needed when:
@@ -174,40 +172,9 @@
   // v8::kGCCallbackFlagForced is used for testing GCs that need to verify
   // that objects indeed died.
   if (flags & v8::kGCCallbackFlagForced) {
-    if (!is_unified) {
-      thread_state->CollectGarbage(
-          BlinkGC::kHeapPointersOnStack, BlinkGC::kAtomicMarking,
-          BlinkGC::kEagerSweeping, BlinkGC::GCReason::kForcedGC);
-    }
-
     // Forces a precise GC at the end of the current event loop.
     thread_state->ScheduleFullGC();
   }
-
-  // In the unified world there is little need to schedule followup garbage
-  // collections as the current GC already computed the whole transitive
-  // closure. We ignore chains of persistent handles here. Cleanup of such
-  // handle chains requires GC loops at the caller side, e.g., see thread
-  // termination.
-  if (is_unified)
-    return;
-
-  if ((flags & v8::kGCCallbackFlagCollectAllAvailableGarbage) ||
-      (flags & v8::kGCCallbackFlagCollectAllExternalMemory)) {
-    // This single GC is not enough. See the above comment.
-    thread_state->CollectGarbage(
-        BlinkGC::kHeapPointersOnStack, BlinkGC::kAtomicMarking,
-        BlinkGC::kEagerSweeping, BlinkGC::GCReason::kForcedGC);
-
-    // The conservative GC might have left floating garbage. Schedule
-    // precise GC to ensure that we collect all available garbage.
-    thread_state->SchedulePreciseGC();
-  }
-
-  // Schedules a precise GC for the next idle time period.
-  if (flags & v8::kGCCallbackScheduleIdleGarbageCollection) {
-    thread_state->ScheduleIdleGC();
-  }
 }
 
 }  // namespace
@@ -258,9 +225,7 @@
 
   ThreadState* current_thread_state = ThreadState::Current();
   if (current_thread_state && !current_thread_state->IsGCForbidden()) {
-    ScheduleFollowupGCs(
-        ThreadState::Current(), flags,
-        RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled());
+    ScheduleFollowupGCs(ThreadState::Current(), flags);
   }
 
   TRACE_EVENT_INSTANT1(TRACE_DISABLED_BY_DEFAULT("devtools.timeline"),
@@ -276,11 +241,7 @@
   if (stack_state != v8::EmbedderHeapTracer::EmbedderStackState::kUnknown) {
     V8PerIsolateData* data = V8PerIsolateData::From(isolate);
     v8::EmbedderHeapTracer* tracer =
-        RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()
-            ? static_cast<v8::EmbedderHeapTracer*>(
-                  data->GetUnifiedHeapController())
-            : static_cast<v8::EmbedderHeapTracer*>(
-                  data->GetScriptWrappableMarkingVisitor());
+        static_cast<v8::EmbedderHeapTracer*>(data->GetUnifiedHeapController());
     // Passing a stack state is only supported when either wrapper tracing or
     // unified heap is enabled.
     CHECK(tracer);
diff --git a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
index b0bfbcf..893ed77 100644
--- a/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
+++ b/third_party/blink/renderer/bindings/core/v8/v8_initializer.cc
@@ -610,17 +610,9 @@
 static void InitializeV8Common(v8::Isolate* isolate) {
   isolate->AddGCPrologueCallback(V8GCController::GcPrologue);
   isolate->AddGCEpilogueCallback(V8GCController::GcEpilogue);
-
-  isolate->SetEmbedderHeapTracer(
-      RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()
-          ? static_cast<v8::EmbedderHeapTracer*>(
-                V8PerIsolateData::From(isolate)->GetUnifiedHeapController())
-          : static_cast<v8::EmbedderHeapTracer*>(
-                V8PerIsolateData::From(isolate)
-                    ->GetScriptWrappableMarkingVisitor()));
-
+  isolate->SetEmbedderHeapTracer(static_cast<v8::EmbedderHeapTracer*>(
+      V8PerIsolateData::From(isolate)->GetUnifiedHeapController()));
   isolate->SetMicrotasksPolicy(v8::MicrotasksPolicy::kScoped);
-
   isolate->SetUseCounterCallback(&UseCounterCallback);
   isolate->SetWasmModuleCallback(WasmModuleOverride);
   isolate->SetWasmInstanceCallback(WasmInstanceOverride);
@@ -702,15 +694,9 @@
   // as setting the tracer indicates that a V8 garbage collection should trace
   // over to Blink.
   DCHECK(ThreadState::MainThreadState());
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()) {
+
     ThreadState::MainThreadState()->RegisterTraceDOMWrappers(
         isolate, V8GCController::TraceDOMWrappers, nullptr, nullptr);
-  } else {
-    ThreadState::MainThreadState()->RegisterTraceDOMWrappers(
-        isolate, V8GCController::TraceDOMWrappers,
-        ScriptWrappableMarkingVisitor::InvalidateDeadObjectsInMarkingDeque,
-        ScriptWrappableMarkingVisitor::PerformCleanup);
-  }
 
   InitializeV8Common(isolate);
 
diff --git a/third_party/blink/renderer/bindings/modules/v8/generated.gni b/third_party/blink/renderer/bindings/modules/v8/generated.gni
index 6df28984..acaf187 100644
--- a/third_party/blink/renderer/bindings/modules/v8/generated.gni
+++ b/third_party/blink/renderer/bindings/modules/v8/generated.gni
@@ -24,6 +24,8 @@
   "$bindings_modules_v8_output_dir/array_buffer_view_or_blob_or_string_or_form_data.h",
   "$bindings_modules_v8_output_dir/audio_context_latency_category_or_double.cc",
   "$bindings_modules_v8_output_dir/audio_context_latency_category_or_double.h",
+  "$bindings_modules_v8_output_dir/blob_or_readable_stream.cc",
+  "$bindings_modules_v8_output_dir/blob_or_readable_stream.h",
   "$bindings_modules_v8_output_dir/boolean_or_constrain_boolean_parameters.cc",
   "$bindings_modules_v8_output_dir/boolean_or_constrain_boolean_parameters.h",
   "$bindings_modules_v8_output_dir/boolean_or_media_track_constraints.cc",
diff --git a/third_party/blink/renderer/controller/BUILD.gn b/third_party/blink/renderer/controller/BUILD.gn
index 65c03e2a..10d082ea 100644
--- a/third_party/blink/renderer/controller/BUILD.gn
+++ b/third_party/blink/renderer/controller/BUILD.gn
@@ -56,6 +56,8 @@
       "memory_usage_monitor_android.h",
       "oom_intervention_impl.cc",
       "oom_intervention_impl.h",
+      "user_level_memory_pressure_signal_generator.cc",
+      "user_level_memory_pressure_signal_generator.h",
     ]
   }
   if (is_mac) {
@@ -154,6 +156,7 @@
       "memory_usage_monitor_android_test.cc",
       "memory_usage_monitor_test.cc",
       "oom_intervention_impl_test.cc",
+      "user_level_memory_pressure_signal_generator_test.cc",
     ]
   }
 
diff --git a/third_party/blink/renderer/controller/blink_initializer.cc b/third_party/blink/renderer/controller/blink_initializer.cc
index 78dcd897..747405c 100644
--- a/third_party/blink/renderer/controller/blink_initializer.cc
+++ b/third_party/blink/renderer/controller/blink_initializer.cc
@@ -59,6 +59,7 @@
 #if defined(OS_ANDROID)
 #include "third_party/blink/renderer/controller/crash_memory_metrics_reporter_impl.h"
 #include "third_party/blink/renderer/controller/oom_intervention_impl.h"
+#include "third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h"
 #endif
 
 namespace blink {
@@ -133,6 +134,9 @@
     MemoryAblationExperiment::MaybeStartForRenderer(task_runner);
 
 #if defined(OS_ANDROID)
+  // Initialize UserLevelMemoryPressureSignalGenerator so it starts monitoring.
+  UserLevelMemoryPressureSignalGenerator::Instance();
+
   // Initialize CrashMemoryMetricsReporterImpl in order to assure that memory
   // allocation does not happen in OnOOMCallback.
   CrashMemoryMetricsReporterImpl::Instance();
diff --git a/third_party/blink/renderer/controller/dev_tools_frontend_impl.cc b/third_party/blink/renderer/controller/dev_tools_frontend_impl.cc
index e877aad8..fa606f3 100644
--- a/third_party/blink/renderer/controller/dev_tools_frontend_impl.cc
+++ b/third_party/blink/renderer/controller/dev_tools_frontend_impl.cc
@@ -79,7 +79,8 @@
     ScriptState::Scope scope(script_state);
     if (devtools_host_)
       devtools_host_->DisconnectClient();
-    devtools_host_ = DevToolsHost::Create(this, GetSupplementable());
+    devtools_host_ =
+        MakeGarbageCollected<DevToolsHost>(this, GetSupplementable());
     v8::Local<v8::Object> global = script_state->GetContext()->Global();
     v8::Local<v8::Value> devtools_host_obj =
         ToV8(devtools_host_.Get(), global, script_state->GetIsolate());
diff --git a/third_party/blink/renderer/controller/memory_usage_monitor.h b/third_party/blink/renderer/controller/memory_usage_monitor.h
index 7b8e120..68ebf79 100644
--- a/third_party/blink/renderer/controller/memory_usage_monitor.h
+++ b/third_party/blink/renderer/controller/memory_usage_monitor.h
@@ -29,6 +29,7 @@
 
  public:
   static MemoryUsageMonitor& Instance();
+  static void SetInstanceForTesting(MemoryUsageMonitor*);
 
   class Observer : public base::CheckedObserver {
    public:
diff --git a/third_party/blink/renderer/controller/memory_usage_monitor_android.cc b/third_party/blink/renderer/controller/memory_usage_monitor_android.cc
index beb9b1b..f82ce3c 100644
--- a/third_party/blink/renderer/controller/memory_usage_monitor_android.cc
+++ b/third_party/blink/renderer/controller/memory_usage_monitor_android.cc
@@ -23,12 +23,19 @@
   return true;
 }
 
+static MemoryUsageMonitor* g_instance_for_testing = nullptr;
+
 }  // namespace
 
 // static
 MemoryUsageMonitor& MemoryUsageMonitor::Instance() {
   DEFINE_STATIC_LOCAL(MemoryUsageMonitorAndroid, monitor, ());
-  return monitor;
+  return g_instance_for_testing ? *g_instance_for_testing : monitor;
+}
+
+// static
+void MemoryUsageMonitor::SetInstanceForTesting(MemoryUsageMonitor* instance) {
+  g_instance_for_testing = instance;
 }
 
 // Since the measurement is done every second in background, optimizations are
diff --git a/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.cc b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.cc
new file mode 100644
index 0000000..b5c8df3a
--- /dev/null
+++ b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.cc
@@ -0,0 +1,139 @@
+// 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 "third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h"
+
+#include <limits>
+#include "base/memory/memory_pressure_listener.h"
+#include "base/metrics/field_trial_params.h"
+#include "base/metrics/histogram_macros.h"
+#include "base/system/sys_info.h"
+#include "third_party/blink/public/common/features.h"
+#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
+#include "third_party/blink/renderer/platform/scheduler/public/thread.h"
+#include "third_party/blink/renderer/platform/scheduler/public/thread_scheduler.h"
+#include "third_party/blink/renderer/platform/wtf/allocator/partitions.h"
+
+namespace blink {
+
+namespace {
+
+constexpr double kDefaultMemoryThresholdMB =
+    std::numeric_limits<double>::infinity();
+
+constexpr base::FeatureParam<double> k512MBDeviceMemoryThresholdParam{
+    &blink::features::kUserLevelMemoryPressureSignal,
+    "param_512mb_device_memory_threshold_mb", kDefaultMemoryThresholdMB};
+
+constexpr base::FeatureParam<double> k1GBDeviceMemoryThresholdParam{
+    &blink::features::kUserLevelMemoryPressureSignal,
+    "param_1gb_device_memory_threshold_mb", kDefaultMemoryThresholdMB};
+
+constexpr base::FeatureParam<double> k2GBDeviceMemoryThresholdParam{
+    &blink::features::kUserLevelMemoryPressureSignal,
+    "param_2gb_device_memory_threshold_mb", kDefaultMemoryThresholdMB};
+
+constexpr base::FeatureParam<double> k3GBDeviceMemoryThresholdParam{
+    &blink::features::kUserLevelMemoryPressureSignal,
+    "param_3gb_device_memory_threshold_mb", kDefaultMemoryThresholdMB};
+
+constexpr base::FeatureParam<double> k4GBDeviceMemoryThresholdParam{
+    &blink::features::kUserLevelMemoryPressureSignal,
+    "param_4gb_device_memory_threshold_mb", kDefaultMemoryThresholdMB};
+
+// Minimum time interval between generated memory pressure signals.
+constexpr double kDefaultMinimumIntervalSeconds = 10 * 60;
+
+constexpr base::FeatureParam<double> kMinimumIntervalSeconds{
+    &blink::features::kUserLevelMemoryPressureSignal, "minimum_interval_s",
+    kDefaultMinimumIntervalSeconds};
+
+}  // namespace
+
+// static
+UserLevelMemoryPressureSignalGenerator&
+UserLevelMemoryPressureSignalGenerator::Instance() {
+  DEFINE_STATIC_LOCAL(UserLevelMemoryPressureSignalGenerator, generator, ());
+  return generator;
+}
+
+UserLevelMemoryPressureSignalGenerator::UserLevelMemoryPressureSignalGenerator()
+    : delayed_report_timer_(
+          Thread::MainThread()->GetTaskRunner(),
+          this,
+          &UserLevelMemoryPressureSignalGenerator::OnTimerFired) {
+  int64_t physical_memory = base::SysInfo::AmountOfPhysicalMemory();
+  if (physical_memory > 3.1 * 1024 * 1024 * 1024)
+    memory_threshold_mb_ = k4GBDeviceMemoryThresholdParam.Get();
+  else if (physical_memory > 2.1 * 1024 * 1024 * 1024)
+    memory_threshold_mb_ = k3GBDeviceMemoryThresholdParam.Get();
+  else if (physical_memory > 1.1 * 1024 * 1024 * 1024)
+    memory_threshold_mb_ = k2GBDeviceMemoryThresholdParam.Get();
+  else if (physical_memory > 600 * 1024 * 1024)
+    memory_threshold_mb_ = k1GBDeviceMemoryThresholdParam.Get();
+  else
+    memory_threshold_mb_ = k512MBDeviceMemoryThresholdParam.Get();
+
+  minimum_interval_ =
+      WTF::TimeDelta::FromSeconds(kMinimumIntervalSeconds.Get());
+
+  // Can be disabled for certain device classes by setting the field param to an
+  // empty string.
+  bool enabled = base::FeatureList::IsEnabled(
+                     blink::features::kUserLevelMemoryPressureSignal) &&
+                 !std::isinf(memory_threshold_mb_);
+  if (enabled) {
+    monitoring_ = true;
+    MemoryUsageMonitor::Instance().AddObserver(this);
+    ThreadScheduler::Current()->AddRAILModeObserver(this);
+  }
+}
+
+UserLevelMemoryPressureSignalGenerator::
+    ~UserLevelMemoryPressureSignalGenerator() {
+  MemoryUsageMonitor::Instance().RemoveObserver(this);
+  ThreadScheduler::Current()->RemoveRAILModeObserver(this);
+}
+
+void UserLevelMemoryPressureSignalGenerator::OnRAILModeChanged(
+    RAILMode rail_mode) {
+  is_loading_ = rail_mode == RAILMode::kLoad;
+}
+
+void UserLevelMemoryPressureSignalGenerator::OnMemoryPing(MemoryUsage usage) {
+  // Disabled during loading as we don't want to purge caches that has just been
+  // created.
+  if (is_loading_)
+    return;
+  if (usage.private_footprint_bytes / 1024 / 1024 < memory_threshold_mb_)
+    return;
+  base::TimeDelta elapsed = WTF::CurrentTimeTicks() - last_generated_;
+  if (elapsed >= WTF::TimeDelta::FromSeconds(kMinimumIntervalSeconds.Get()))
+    Generate(usage);
+}
+
+void UserLevelMemoryPressureSignalGenerator::Generate(MemoryUsage usage) {
+  UMA_HISTOGRAM_MEMORY_LARGE_MB(
+      "Memory.Experimental.UserLevelMemoryPressureSignal."
+      "RendererPrivateMemoryFootprintBefore",
+      base::saturated_cast<base::Histogram::Sample>(
+          usage.private_footprint_bytes / 1024 / 1024));
+
+  base::MemoryPressureListener::NotifyMemoryPressure(
+      base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
+  last_generated_ = WTF::CurrentTimeTicks();
+
+  delayed_report_timer_.StartOneShot(TimeDelta::FromSeconds(10), FROM_HERE);
+}
+
+void UserLevelMemoryPressureSignalGenerator::OnTimerFired(TimerBase*) {
+  MemoryUsage usage = MemoryUsageMonitor::Instance().GetCurrentMemoryUsage();
+  UMA_HISTOGRAM_MEMORY_LARGE_MB(
+      "Memory.Experimental.UserLevelMemoryPressureSignal."
+      "RendererPrivateMemoryFootprintAfter",
+      base::saturated_cast<base::Histogram::Sample>(
+          usage.private_footprint_bytes / 1024 / 1024));
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h
new file mode 100644
index 0000000..91bd2c3
--- /dev/null
+++ b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h
@@ -0,0 +1,59 @@
+// 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 THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_
+#define THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_
+
+#include "third_party/blink/renderer/controller/controller_export.h"
+#include "third_party/blink/renderer/controller/memory_usage_monitor.h"
+#include "third_party/blink/renderer/platform/scheduler/public/rail_mode_observer.h"
+#include "third_party/blink/renderer/platform/timer.h"
+#include "third_party/blink/renderer/platform/wtf/allocator.h"
+
+namespace blink {
+
+// Generates extra memory pressure signals (on top of the OS generated ones)
+// when the memory usage goes over a threshold.
+class CONTROLLER_EXPORT UserLevelMemoryPressureSignalGenerator
+    : public RAILModeObserver,
+      public MemoryUsageMonitor::Observer {
+  USING_FAST_MALLOC(UserLevelMemoryPressureSignalGenerator);
+
+ public:
+  // Returns the shared instance.
+  static UserLevelMemoryPressureSignalGenerator& Instance();
+
+  UserLevelMemoryPressureSignalGenerator();
+  ~UserLevelMemoryPressureSignalGenerator() override;
+
+ protected:
+  // This is only virtual to override in tests.
+  virtual void Generate(MemoryUsage);
+
+ private:
+  FRIEND_TEST_ALL_PREFIXES(UserLevelMemoryPressureSignalGeneratorTest,
+                           GeneratesWhenOverThreshold);
+  FRIEND_TEST_ALL_PREFIXES(UserLevelMemoryPressureSignalGeneratorTest,
+                           GenerationPauses);
+
+  // Called by delayed_report_timer_ to report metrics.
+  void OnTimerFired(TimerBase*);
+
+  // RAILModeObserver:
+  void OnRAILModeChanged(RAILMode rail_mode) override;
+
+  // MemoryUsageMonitor::Observer:
+  void OnMemoryPing(MemoryUsage) override;
+
+  bool monitoring_ = false;
+  bool is_loading_ = false;
+  WTF::TimeTicks last_generated_;
+  double memory_threshold_mb_;
+  WTF::TimeDelta minimum_interval_;
+  TaskRunnerTimer<UserLevelMemoryPressureSignalGenerator> delayed_report_timer_;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_CONTROLLER_USER_LEVEL_MEMORY_PRESSURE_SIGNAL_GENERATOR_H_
diff --git a/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator_test.cc b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator_test.cc
new file mode 100644
index 0000000..7423f7a
--- /dev/null
+++ b/third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator_test.cc
@@ -0,0 +1,171 @@
+// 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 "third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.h"
+
+#include "base/test/scoped_feature_list.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/features.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "third_party/blink/renderer/platform/testing/wtf/scoped_mock_clock.h"
+
+namespace blink {
+
+using testing::_;
+
+// Mock that allows setting mock memory usage.
+class MockMemoryUsageMonitor : public MemoryUsageMonitor {
+ public:
+  MockMemoryUsageMonitor() = default;
+  ~MockMemoryUsageMonitor() override = default;
+
+  MemoryUsage GetCurrentMemoryUsage() override { return mock_memory_usage_; }
+
+  // MemoryUsageMonitor will report the current memory usage as this value.
+  void SetMockMemoryUsage(MemoryUsage usage) { mock_memory_usage_ = usage; }
+
+ private:
+  MemoryUsage mock_memory_usage_;
+};
+
+class MockUserLevelMemoryPressureSignalGenerator
+    : public UserLevelMemoryPressureSignalGenerator {
+ public:
+  MockUserLevelMemoryPressureSignalGenerator() {
+    ON_CALL(*this, Generate(_))
+        .WillByDefault(testing::Invoke(
+            this, &MockUserLevelMemoryPressureSignalGenerator::RealGenerate));
+  }
+  ~MockUserLevelMemoryPressureSignalGenerator() override = default;
+
+  MOCK_METHOD1(Generate, void(MemoryUsage));
+
+  void RealGenerate(MemoryUsage usage) {
+    UserLevelMemoryPressureSignalGenerator::Generate(usage);
+  }
+};
+
+class ScopedMockMemoryUsageMonitor {
+ public:
+  ScopedMockMemoryUsageMonitor(MemoryUsageMonitor* monitor) {
+    MemoryUsageMonitor::SetInstanceForTesting(monitor);
+  }
+  ~ScopedMockMemoryUsageMonitor() {
+    MemoryUsageMonitor::SetInstanceForTesting(nullptr);
+  }
+};
+
+class UserLevelMemoryPressureSignalGeneratorTest : public testing::Test {
+ public:
+  UserLevelMemoryPressureSignalGeneratorTest() = default;
+
+  void SetUp() override {
+    std::map<std::string, std::string> feature_parameters;
+    feature_parameters["param_512mb_device_memory_threshold_mb"] = "1024.0";
+    feature_parameters["param_1gb_device_memory_threshold_mb"] = "1024.0";
+    feature_parameters["param_2gb_device_memory_threshold_mb"] = "1024.0";
+    feature_parameters["param_3gb_device_memory_threshold_mb"] = "1024.0";
+    feature_parameters["param_4gb_device_memory_threshold_mb"] = "1024.0";
+    feature_parameters["minimum_interval_s"] = "600.0";
+
+    scoped_feature_list_.InitAndEnableFeatureWithParameters(
+        blink::features::kUserLevelMemoryPressureSignal, feature_parameters);
+  }
+
+ protected:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+namespace {
+constexpr double kMemoryThresholdBytes = 1024 * 1024 * 1024;
+}
+
+TEST_F(UserLevelMemoryPressureSignalGeneratorTest, GeneratesWhenOverThreshold) {
+  {
+    WTF::ScopedMockClock clock;
+    std::unique_ptr<MockMemoryUsageMonitor> mock_memory_usage_monitor =
+        std::make_unique<MockMemoryUsageMonitor>();
+    ScopedMockMemoryUsageMonitor mock_memory_usage_scope(
+        mock_memory_usage_monitor.get());
+    MockUserLevelMemoryPressureSignalGenerator generator;
+    {
+      EXPECT_CALL(generator, Generate(_)).Times(0);
+      MemoryUsage usage;
+      usage.v8_bytes = 0;
+      usage.blink_gc_bytes = 0;
+      usage.partition_alloc_bytes = 0;
+      usage.private_footprint_bytes = kMemoryThresholdBytes - 1024 * 1024;
+      usage.swap_bytes = 0;
+      usage.vm_size_bytes = 0;
+      mock_memory_usage_monitor->SetMockMemoryUsage(usage);
+      clock.Advance(TimeDelta::FromSeconds(1));
+      test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+    }
+    {
+      EXPECT_CALL(generator, Generate(_)).Times(1);
+      MemoryUsage usage;
+      usage.v8_bytes = 0;
+      usage.blink_gc_bytes = 0;
+      usage.partition_alloc_bytes = 0;
+      usage.private_footprint_bytes = kMemoryThresholdBytes + 1024 * 1024;
+      usage.swap_bytes = 0;
+      usage.vm_size_bytes = 0;
+      mock_memory_usage_monitor->SetMockMemoryUsage(usage);
+      clock.Advance(TimeDelta::FromMinutes(10));
+      test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+    }
+  }
+}
+
+TEST_F(UserLevelMemoryPressureSignalGeneratorTest, GenerationPauses) {
+  {
+    WTF::ScopedMockClock clock;
+    std::unique_ptr<MockMemoryUsageMonitor> mock_memory_usage_monitor =
+        std::make_unique<MockMemoryUsageMonitor>();
+    ScopedMockMemoryUsageMonitor mock_memory_usage_scope(
+        mock_memory_usage_monitor.get());
+    MockUserLevelMemoryPressureSignalGenerator generator;
+    {
+      MemoryUsage usage;
+      usage.v8_bytes = 0;
+      usage.blink_gc_bytes = 0;
+      usage.partition_alloc_bytes = 0;
+      usage.private_footprint_bytes = kMemoryThresholdBytes + 1024 * 1024;
+      usage.swap_bytes = 0;
+      usage.vm_size_bytes = 0;
+      mock_memory_usage_monitor->SetMockMemoryUsage(usage);
+      clock.Advance(TimeDelta::FromMinutes(10));
+      // Generated
+      {
+        EXPECT_CALL(generator, Generate(_)).Times(1);
+        test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+      }
+
+      clock.Advance(TimeDelta::FromMinutes(1));
+      // Not generated because too soon
+      {
+        EXPECT_CALL(generator, Generate(_)).Times(0);
+        test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+      }
+
+      clock.Advance(TimeDelta::FromMinutes(10));
+      generator.OnRAILModeChanged(RAILMode::kLoad);
+      // Not generated because loading
+      {
+        EXPECT_CALL(generator, Generate(_)).Times(0);
+        test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+      }
+
+      generator.OnRAILModeChanged(RAILMode::kAnimation);
+      // Generated
+      {
+        EXPECT_CALL(generator, Generate(_)).Times(1);
+        test::RunDelayedTasks(TimeDelta::FromSeconds(1));
+      }
+    }
+  }
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index b08c070..49a8d975 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1754,6 +1754,7 @@
     "css/css_syntax_string_parser_test.cc",
     "css/css_test_helpers.cc",
     "css/css_test_helpers.h",
+    "css/css_uri_value_test.cc",
     "css/css_value_test_helper.h",
     "css/cssom/cross_thread_style_value_test.cc",
     "css/cssom/css_math_invert_test.cc",
diff --git a/third_party/blink/renderer/core/css/BUILD.gn b/third_party/blink/renderer/core/css/BUILD.gn
index 51a1293..d284dd6d 100644
--- a/third_party/blink/renderer/core/css/BUILD.gn
+++ b/third_party/blink/renderer/core/css/BUILD.gn
@@ -427,448 +427,13 @@
     "properties/css_unresolved_property.cc",
     "properties/css_unresolved_property.h",
     "properties/longhand.h",
-    "properties/longhands/align_content_custom.cc",
-    "properties/longhands/align_items_custom.cc",
-    "properties/longhands/align_self_custom.cc",
-    "properties/longhands/alignment_baseline_custom.cc",
-    "properties/longhands/animation_delay_custom.cc",
-    "properties/longhands/animation_direction_custom.cc",
-    "properties/longhands/animation_duration_custom.cc",
-    "properties/longhands/animation_fill_mode_custom.cc",
-    "properties/longhands/animation_iteration_count_custom.cc",
-    "properties/longhands/animation_name_custom.cc",
-    "properties/longhands/animation_play_state_custom.cc",
-    "properties/longhands/animation_timing_function_custom.cc",
-    "properties/longhands/backdrop_filter_custom.cc",
-    "properties/longhands/backface_visibility_custom.cc",
-    "properties/longhands/background_attachment_custom.cc",
-    "properties/longhands/background_blend_mode_custom.cc",
-    "properties/longhands/background_clip_custom.cc",
-    "properties/longhands/background_color_custom.cc",
-    "properties/longhands/background_image_custom.cc",
-    "properties/longhands/background_origin_custom.cc",
-    "properties/longhands/background_position_x_custom.cc",
-    "properties/longhands/background_position_y_custom.cc",
-    "properties/longhands/background_size_custom.cc",
-    "properties/longhands/baseline_shift_custom.cc",
-    "properties/longhands/block_size_custom.cc",
-    "properties/longhands/border_block_end_color_custom.cc",
-    "properties/longhands/border_block_end_width_custom.cc",
-    "properties/longhands/border_block_start_color_custom.cc",
-    "properties/longhands/border_block_start_width_custom.cc",
-    "properties/longhands/border_bottom_color_custom.cc",
-    "properties/longhands/border_bottom_left_radius_custom.cc",
-    "properties/longhands/border_bottom_right_radius_custom.cc",
-    "properties/longhands/border_bottom_style_custom.cc",
-    "properties/longhands/border_bottom_width_custom.cc",
-    "properties/longhands/border_collapse_custom.cc",
-    "properties/longhands/border_image_outset_custom.cc",
-    "properties/longhands/border_image_repeat_custom.cc",
-    "properties/longhands/border_image_slice_custom.cc",
-    "properties/longhands/border_image_source_custom.cc",
-    "properties/longhands/border_image_width_custom.cc",
-    "properties/longhands/border_inline_end_color_custom.cc",
-    "properties/longhands/border_inline_end_width_custom.cc",
-    "properties/longhands/border_inline_start_color_custom.cc",
-    "properties/longhands/border_inline_start_width_custom.cc",
-    "properties/longhands/border_left_color_custom.cc",
-    "properties/longhands/border_left_style_custom.cc",
-    "properties/longhands/border_left_width_custom.cc",
-    "properties/longhands/border_right_color_custom.cc",
-    "properties/longhands/border_right_style_custom.cc",
-    "properties/longhands/border_right_width_custom.cc",
-    "properties/longhands/border_top_color_custom.cc",
-    "properties/longhands/border_top_left_radius_custom.cc",
-    "properties/longhands/border_top_right_radius_custom.cc",
-    "properties/longhands/border_top_style_custom.cc",
-    "properties/longhands/border_top_width_custom.cc",
-    "properties/longhands/bottom_custom.cc",
-    "properties/longhands/box_shadow_custom.cc",
-    "properties/longhands/box_sizing_custom.cc",
-    "properties/longhands/break_after_custom.cc",
-    "properties/longhands/break_before_custom.cc",
-    "properties/longhands/break_inside_custom.cc",
-    "properties/longhands/buffered_rendering_custom.cc",
-    "properties/longhands/caption_side_custom.cc",
-    "properties/longhands/caret_color_custom.cc",
-    "properties/longhands/clear_custom.cc",
-    "properties/longhands/clip_custom.cc",
-    "properties/longhands/clip_path_custom.cc",
-    "properties/longhands/clip_rule_custom.cc",
-    "properties/longhands/color_custom.cc",
-    "properties/longhands/color_interpolation_custom.cc",
-    "properties/longhands/color_interpolation_filters_custom.cc",
-    "properties/longhands/color_rendering_custom.cc",
-    "properties/longhands/column_count_custom.cc",
-    "properties/longhands/column_fill_custom.cc",
-    "properties/longhands/column_gap_custom.cc",
-    "properties/longhands/column_rule_color_custom.cc",
-    "properties/longhands/column_rule_style_custom.cc",
-    "properties/longhands/column_rule_width_custom.cc",
-    "properties/longhands/column_span_custom.cc",
-    "properties/longhands/column_width_custom.cc",
-    "properties/longhands/contain_custom.cc",
-    "properties/longhands/content_custom.cc",
-    "properties/longhands/counter_increment_custom.cc",
-    "properties/longhands/counter_reset_custom.cc",
-    "properties/longhands/cursor_custom.cc",
     "properties/longhands/custom_property.cc",
     "properties/longhands/custom_property.h",
-    "properties/longhands/cx_custom.cc",
-    "properties/longhands/cy_custom.cc",
-    "properties/longhands/d_custom.cc",
-    "properties/longhands/direction_custom.cc",
-    "properties/longhands/display_custom.cc",
-    "properties/longhands/dominant_baseline_custom.cc",
-    "properties/longhands/empty_cells_custom.cc",
-    "properties/longhands/fill_custom.cc",
-    "properties/longhands/fill_opacity_custom.cc",
-    "properties/longhands/fill_rule_custom.cc",
-    "properties/longhands/filter_custom.cc",
-    "properties/longhands/flex_basis_custom.cc",
-    "properties/longhands/flex_direction_custom.cc",
-    "properties/longhands/flex_grow_custom.cc",
-    "properties/longhands/flex_shrink_custom.cc",
-    "properties/longhands/flex_wrap_custom.cc",
-    "properties/longhands/float_custom.cc",
-    "properties/longhands/flood_color_custom.cc",
-    "properties/longhands/flood_opacity_custom.cc",
-    "properties/longhands/font_family_custom.cc",
-    "properties/longhands/font_feature_settings_custom.cc",
-    "properties/longhands/font_kerning_custom.cc",
-    "properties/longhands/font_size_adjust_custom.cc",
-    "properties/longhands/font_size_custom.cc",
-    "properties/longhands/font_stretch_custom.cc",
-    "properties/longhands/font_style_custom.cc",
-    "properties/longhands/font_variant_caps_custom.cc",
-    "properties/longhands/font_variant_east_asian_custom.cc",
-    "properties/longhands/font_variant_ligatures_custom.cc",
-    "properties/longhands/font_variant_numeric_custom.cc",
-    "properties/longhands/font_variation_settings_custom.cc",
-    "properties/longhands/font_weight_custom.cc",
-    "properties/longhands/grid_auto_columns_custom.cc",
-    "properties/longhands/grid_auto_flow_custom.cc",
-    "properties/longhands/grid_auto_rows_custom.cc",
-    "properties/longhands/grid_column_end_custom.cc",
-    "properties/longhands/grid_column_start_custom.cc",
-    "properties/longhands/grid_row_end_custom.cc",
-    "properties/longhands/grid_row_start_custom.cc",
-    "properties/longhands/grid_template_areas_custom.cc",
-    "properties/longhands/grid_template_columns_custom.cc",
-    "properties/longhands/grid_template_rows_custom.cc",
-    "properties/longhands/height_custom.cc",
-    "properties/longhands/hyphens_custom.cc",
-    "properties/longhands/image_orientation_custom.cc",
-    "properties/longhands/image_rendering_custom.cc",
-    "properties/longhands/inline_size_custom.cc",
-    "properties/longhands/inset_block_end_custom.cc",
-    "properties/longhands/inset_block_start_custom.cc",
-    "properties/longhands/inset_inline_end_custom.cc",
-    "properties/longhands/inset_inline_start_custom.cc",
-    "properties/longhands/isolation_custom.cc",
-    "properties/longhands/justify_content_custom.cc",
-    "properties/longhands/justify_items_custom.cc",
-    "properties/longhands/justify_self_custom.cc",
-    "properties/longhands/left_custom.cc",
-    "properties/longhands/letter_spacing_custom.cc",
-    "properties/longhands/lighting_color_custom.cc",
-    "properties/longhands/line_break_custom.cc",
-    "properties/longhands/line_height_custom.cc",
-    "properties/longhands/line_height_step_custom.cc",
-    "properties/longhands/list_style_image_custom.cc",
-    "properties/longhands/list_style_position_custom.cc",
-    "properties/longhands/list_style_type_custom.cc",
-    "properties/longhands/margin_block_end_custom.cc",
-    "properties/longhands/margin_block_start_custom.cc",
-    "properties/longhands/margin_bottom_custom.cc",
-    "properties/longhands/margin_inline_end_custom.cc",
-    "properties/longhands/margin_inline_start_custom.cc",
-    "properties/longhands/margin_left_custom.cc",
-    "properties/longhands/margin_right_custom.cc",
-    "properties/longhands/margin_top_custom.cc",
-    "properties/longhands/marker_end_custom.cc",
-    "properties/longhands/marker_mid_custom.cc",
-    "properties/longhands/marker_start_custom.cc",
-    "properties/longhands/mask_custom.cc",
-    "properties/longhands/mask_source_type_custom.cc",
-    "properties/longhands/mask_type_custom.cc",
-    "properties/longhands/max_block_size_custom.cc",
-    "properties/longhands/max_height_custom.cc",
-    "properties/longhands/max_inline_size_custom.cc",
-    "properties/longhands/max_width_custom.cc",
-    "properties/longhands/min_block_size_custom.cc",
-    "properties/longhands/min_height_custom.cc",
-    "properties/longhands/min_inline_size_custom.cc",
-    "properties/longhands/min_width_custom.cc",
-    "properties/longhands/mix_blend_mode_custom.cc",
-    "properties/longhands/object_fit_custom.cc",
-    "properties/longhands/object_position_custom.cc",
-    "properties/longhands/offset_anchor_custom.cc",
-    "properties/longhands/offset_distance_custom.cc",
-    "properties/longhands/offset_path_custom.cc",
-    "properties/longhands/offset_position_custom.cc",
-    "properties/longhands/offset_rotate_custom.cc",
-    "properties/longhands/opacity_custom.cc",
-    "properties/longhands/order_custom.cc",
-    "properties/longhands/orphans_custom.cc",
-    "properties/longhands/outline_color_custom.cc",
-    "properties/longhands/outline_offset_custom.cc",
-    "properties/longhands/outline_style_custom.cc",
-    "properties/longhands/outline_width_custom.cc",
-    "properties/longhands/overflow_anchor_custom.cc",
-    "properties/longhands/overflow_wrap_custom.cc",
-    "properties/longhands/overflow_x_custom.cc",
-    "properties/longhands/overflow_y_custom.cc",
-    "properties/longhands/overscroll_behavior_x_custom.cc",
-    "properties/longhands/overscroll_behavior_y_custom.cc",
-    "properties/longhands/padding_block_end_custom.cc",
-    "properties/longhands/padding_block_start_custom.cc",
-    "properties/longhands/padding_bottom_custom.cc",
-    "properties/longhands/padding_inline_end_custom.cc",
-    "properties/longhands/padding_inline_start_custom.cc",
-    "properties/longhands/padding_left_custom.cc",
-    "properties/longhands/padding_right_custom.cc",
-    "properties/longhands/padding_top_custom.cc",
-    "properties/longhands/page_custom.cc",
-    "properties/longhands/paint_order_custom.cc",
-    "properties/longhands/perspective_custom.cc",
-    "properties/longhands/perspective_origin_custom.cc",
-    "properties/longhands/pointer_events_custom.cc",
-    "properties/longhands/position_custom.cc",
-    "properties/longhands/quotes_custom.cc",
-    "properties/longhands/r_custom.cc",
-    "properties/longhands/resize_custom.cc",
-    "properties/longhands/right_custom.cc",
-    "properties/longhands/rotate_custom.cc",
-    "properties/longhands/row_gap_custom.cc",
-    "properties/longhands/rx_custom.cc",
-    "properties/longhands/ry_custom.cc",
-    "properties/longhands/scale_custom.cc",
-    "properties/longhands/scroll_behavior_custom.cc",
-    "properties/longhands/scroll_customization_custom.cc",
-    "properties/longhands/scroll_margin_block_end_custom.cc",
-    "properties/longhands/scroll_margin_block_start_custom.cc",
-    "properties/longhands/scroll_margin_bottom_custom.cc",
-    "properties/longhands/scroll_margin_inline_end_custom.cc",
-    "properties/longhands/scroll_margin_inline_start_custom.cc",
-    "properties/longhands/scroll_margin_left_custom.cc",
-    "properties/longhands/scroll_margin_right_custom.cc",
-    "properties/longhands/scroll_margin_top_custom.cc",
-    "properties/longhands/scroll_padding_block_end_custom.cc",
-    "properties/longhands/scroll_padding_block_start_custom.cc",
-    "properties/longhands/scroll_padding_bottom_custom.cc",
-    "properties/longhands/scroll_padding_inline_end_custom.cc",
-    "properties/longhands/scroll_padding_inline_start_custom.cc",
-    "properties/longhands/scroll_padding_left_custom.cc",
-    "properties/longhands/scroll_padding_right_custom.cc",
-    "properties/longhands/scroll_padding_top_custom.cc",
-    "properties/longhands/scroll_snap_align_custom.cc",
-    "properties/longhands/scroll_snap_stop_custom.cc",
-    "properties/longhands/scroll_snap_type_custom.cc",
-    "properties/longhands/shape_image_threshold_custom.cc",
-    "properties/longhands/shape_margin_custom.cc",
-    "properties/longhands/shape_outside_custom.cc",
-    "properties/longhands/shape_rendering_custom.cc",
-    "properties/longhands/size_custom.cc",
-    "properties/longhands/speak_custom.cc",
-    "properties/longhands/stop_color_custom.cc",
-    "properties/longhands/stop_opacity_custom.cc",
-    "properties/longhands/stroke_custom.cc",
-    "properties/longhands/stroke_dasharray_custom.cc",
-    "properties/longhands/stroke_dashoffset_custom.cc",
-    "properties/longhands/stroke_linecap_custom.cc",
-    "properties/longhands/stroke_linejoin_custom.cc",
-    "properties/longhands/stroke_miterlimit_custom.cc",
-    "properties/longhands/stroke_opacity_custom.cc",
-    "properties/longhands/stroke_width_custom.cc",
-    "properties/longhands/tab_size_custom.cc",
-    "properties/longhands/table_layout_custom.cc",
-    "properties/longhands/text_align_custom.cc",
-    "properties/longhands/text_align_last_custom.cc",
-    "properties/longhands/text_anchor_custom.cc",
-    "properties/longhands/text_combine_upright_custom.cc",
-    "properties/longhands/text_decoration_color_custom.cc",
-    "properties/longhands/text_decoration_line_custom.cc",
-    "properties/longhands/text_decoration_skip_ink_custom.cc",
-    "properties/longhands/text_decoration_style_custom.cc",
-    "properties/longhands/text_indent_custom.cc",
-    "properties/longhands/text_justify_custom.cc",
-    "properties/longhands/text_orientation_custom.cc",
-    "properties/longhands/text_overflow_custom.cc",
-    "properties/longhands/text_rendering_custom.cc",
-    "properties/longhands/text_shadow_custom.cc",
-    "properties/longhands/text_size_adjust_custom.cc",
-    "properties/longhands/text_transform_custom.cc",
-    "properties/longhands/text_underline_position_custom.cc",
-    "properties/longhands/top_custom.cc",
-    "properties/longhands/touch_action_custom.cc",
-    "properties/longhands/transform_box_custom.cc",
-    "properties/longhands/transform_custom.cc",
-    "properties/longhands/transform_origin_custom.cc",
-    "properties/longhands/transform_style_custom.cc",
-    "properties/longhands/transition_delay_custom.cc",
-    "properties/longhands/transition_duration_custom.cc",
-    "properties/longhands/transition_property_custom.cc",
-    "properties/longhands/transition_timing_function_custom.cc",
-    "properties/longhands/translate_custom.cc",
-    "properties/longhands/unicode_bidi_custom.cc",
-    "properties/longhands/user_select_custom.cc",
+    "properties/longhands/longhands_custom.cc",
     "properties/longhands/variable.cc",
     "properties/longhands/variable.h",
-    "properties/longhands/vector_effect_custom.cc",
-    "properties/longhands/vertical_align_custom.cc",
-    "properties/longhands/visibility_custom.cc",
-    "properties/longhands/webkit_app_region_custom.cc",
-    "properties/longhands/webkit_appearance_custom.cc",
-    "properties/longhands/webkit_border_horizontal_spacing_custom.cc",
-    "properties/longhands/webkit_border_image_custom.cc",
-    "properties/longhands/webkit_border_vertical_spacing_custom.cc",
-    "properties/longhands/webkit_box_align_custom.cc",
-    "properties/longhands/webkit_box_decoration_break_custom.cc",
-    "properties/longhands/webkit_box_direction_custom.cc",
-    "properties/longhands/webkit_box_flex_custom.cc",
-    "properties/longhands/webkit_box_ordinal_group_custom.cc",
-    "properties/longhands/webkit_box_orient_custom.cc",
-    "properties/longhands/webkit_box_pack_custom.cc",
-    "properties/longhands/webkit_box_reflect_custom.cc",
-    "properties/longhands/webkit_font_size_delta_custom.cc",
-    "properties/longhands/webkit_font_smoothing_custom.cc",
-    "properties/longhands/webkit_highlight_custom.cc",
-    "properties/longhands/webkit_hyphenate_character_custom.cc",
-    "properties/longhands/webkit_line_break_custom.cc",
-    "properties/longhands/webkit_line_clamp_custom.cc",
-    "properties/longhands/webkit_locale_custom.cc",
-    "properties/longhands/webkit_margin_after_collapse_custom.cc",
-    "properties/longhands/webkit_margin_before_collapse_custom.cc",
-    "properties/longhands/webkit_margin_bottom_collapse_custom.cc",
-    "properties/longhands/webkit_margin_top_collapse_custom.cc",
-    "properties/longhands/webkit_mask_box_image_outset_custom.cc",
-    "properties/longhands/webkit_mask_box_image_repeat_custom.cc",
-    "properties/longhands/webkit_mask_box_image_slice_custom.cc",
-    "properties/longhands/webkit_mask_box_image_source_custom.cc",
-    "properties/longhands/webkit_mask_box_image_width_custom.cc",
-    "properties/longhands/webkit_mask_clip_custom.cc",
-    "properties/longhands/webkit_mask_composite_custom.cc",
-    "properties/longhands/webkit_mask_image_custom.cc",
-    "properties/longhands/webkit_mask_origin_custom.cc",
-    "properties/longhands/webkit_mask_position_x_custom.cc",
-    "properties/longhands/webkit_mask_position_y_custom.cc",
-    "properties/longhands/webkit_mask_size_custom.cc",
-    "properties/longhands/webkit_perspective_origin_x_custom.cc",
-    "properties/longhands/webkit_perspective_origin_y_custom.cc",
-    "properties/longhands/webkit_print_color_adjust_custom.cc",
-    "properties/longhands/webkit_rtl_ordering_custom.cc",
-    "properties/longhands/webkit_ruby_position_custom.cc",
-    "properties/longhands/webkit_tap_highlight_color_custom.cc",
-    "properties/longhands/webkit_text_combine_custom.cc",
-    "properties/longhands/webkit_text_decorations_in_effect_custom.cc",
-    "properties/longhands/webkit_text_emphasis_color_custom.cc",
-    "properties/longhands/webkit_text_emphasis_position_custom.cc",
-    "properties/longhands/webkit_text_emphasis_style_custom.cc",
-    "properties/longhands/webkit_text_fill_color_custom.cc",
-    "properties/longhands/webkit_text_orientation_custom.cc",
-    "properties/longhands/webkit_text_security_custom.cc",
-    "properties/longhands/webkit_text_stroke_color_custom.cc",
-    "properties/longhands/webkit_text_stroke_width_custom.cc",
-    "properties/longhands/webkit_transform_origin_x_custom.cc",
-    "properties/longhands/webkit_transform_origin_y_custom.cc",
-    "properties/longhands/webkit_transform_origin_z_custom.cc",
-    "properties/longhands/webkit_user_drag_custom.cc",
-    "properties/longhands/webkit_user_modify_custom.cc",
-    "properties/longhands/webkit_writing_mode_custom.cc",
-    "properties/longhands/white_space_custom.cc",
-    "properties/longhands/widows_custom.cc",
-    "properties/longhands/width_custom.cc",
-    "properties/longhands/will_change_custom.cc",
-    "properties/longhands/word_break_custom.cc",
-    "properties/longhands/word_spacing_custom.cc",
-    "properties/longhands/writing_mode_custom.cc",
-    "properties/longhands/x_custom.cc",
-    "properties/longhands/y_custom.cc",
-    "properties/longhands/z_index_custom.cc",
-    "properties/longhands/zoom_custom.cc",
     "properties/shorthand.h",
-    "properties/shorthands/animation_custom.cc",
-    "properties/shorthands/background_custom.cc",
-    "properties/shorthands/background_position_custom.cc",
-    "properties/shorthands/background_repeat_custom.cc",
-    "properties/shorthands/border_block_color_custom.cc",
-    "properties/shorthands/border_block_custom.cc",
-    "properties/shorthands/border_block_end_custom.cc",
-    "properties/shorthands/border_block_start_custom.cc",
-    "properties/shorthands/border_block_style_custom.cc",
-    "properties/shorthands/border_block_width_custom.cc",
-    "properties/shorthands/border_bottom_custom.cc",
-    "properties/shorthands/border_color_custom.cc",
-    "properties/shorthands/border_custom.cc",
-    "properties/shorthands/border_image_custom.cc",
-    "properties/shorthands/border_inline_color_custom.cc",
-    "properties/shorthands/border_inline_custom.cc",
-    "properties/shorthands/border_inline_end_custom.cc",
-    "properties/shorthands/border_inline_start_custom.cc",
-    "properties/shorthands/border_inline_style_custom.cc",
-    "properties/shorthands/border_inline_width_custom.cc",
-    "properties/shorthands/border_left_custom.cc",
-    "properties/shorthands/border_radius_custom.cc",
-    "properties/shorthands/border_right_custom.cc",
-    "properties/shorthands/border_spacing_custom.cc",
-    "properties/shorthands/border_style_custom.cc",
-    "properties/shorthands/border_top_custom.cc",
-    "properties/shorthands/border_width_custom.cc",
-    "properties/shorthands/column_rule_custom.cc",
-    "properties/shorthands/columns_custom.cc",
-    "properties/shorthands/flex_custom.cc",
-    "properties/shorthands/flex_flow_custom.cc",
-    "properties/shorthands/font_custom.cc",
-    "properties/shorthands/font_variant_custom.cc",
-    "properties/shorthands/gap_custom.cc",
-    "properties/shorthands/grid_area_custom.cc",
-    "properties/shorthands/grid_column_custom.cc",
-    "properties/shorthands/grid_column_gap_custom.cc",
-    "properties/shorthands/grid_custom.cc",
-    "properties/shorthands/grid_gap_custom.cc",
-    "properties/shorthands/grid_row_custom.cc",
-    "properties/shorthands/grid_row_gap_custom.cc",
-    "properties/shorthands/grid_template_custom.cc",
-    "properties/shorthands/inset_block_custom.cc",
-    "properties/shorthands/inset_custom.cc",
-    "properties/shorthands/inset_inline_custom.cc",
-    "properties/shorthands/list_style_custom.cc",
-    "properties/shorthands/margin_block_custom.cc",
-    "properties/shorthands/margin_custom.cc",
-    "properties/shorthands/margin_inline_custom.cc",
-    "properties/shorthands/marker_custom.cc",
-    "properties/shorthands/offset_custom.cc",
-    "properties/shorthands/outline_custom.cc",
-    "properties/shorthands/overflow_custom.cc",
-    "properties/shorthands/overscroll_behavior_custom.cc",
-    "properties/shorthands/padding_block_custom.cc",
-    "properties/shorthands/padding_custom.cc",
-    "properties/shorthands/padding_inline_custom.cc",
-    "properties/shorthands/page_break_after_custom.cc",
-    "properties/shorthands/page_break_before_custom.cc",
-    "properties/shorthands/page_break_inside_custom.cc",
-    "properties/shorthands/place_content_custom.cc",
-    "properties/shorthands/place_items_custom.cc",
-    "properties/shorthands/place_self_custom.cc",
-    "properties/shorthands/scroll_margin_block_custom.cc",
-    "properties/shorthands/scroll_margin_custom.cc",
-    "properties/shorthands/scroll_margin_inline_custom.cc",
-    "properties/shorthands/scroll_padding_block_custom.cc",
-    "properties/shorthands/scroll_padding_custom.cc",
-    "properties/shorthands/scroll_padding_inline_custom.cc",
-    "properties/shorthands/text_decoration_custom.cc",
-    "properties/shorthands/transition_custom.cc",
-    "properties/shorthands/webkit_column_break_after_custom.cc",
-    "properties/shorthands/webkit_column_break_before_custom.cc",
-    "properties/shorthands/webkit_column_break_inside_custom.cc",
-    "properties/shorthands/webkit_margin_collapse_custom.cc",
-    "properties/shorthands/webkit_mask_box_image_custom.cc",
-    "properties/shorthands/webkit_mask_custom.cc",
-    "properties/shorthands/webkit_mask_position_custom.cc",
-    "properties/shorthands/webkit_mask_repeat_custom.cc",
-    "properties/shorthands/webkit_text_emphasis_custom.cc",
-    "properties/shorthands/webkit_text_stroke_custom.cc",
+    "properties/shorthands/shorthands_custom.cc",
     "properties/style_building_utils.h",
     "property_registration.cc",
     "property_registration.h",
diff --git a/third_party/blink/renderer/core/css/css_syntax_descriptor.h b/third_party/blink/renderer/core/css/css_syntax_descriptor.h
index 836465a7..5ea14950 100644
--- a/third_party/blink/renderer/core/css/css_syntax_descriptor.h
+++ b/third_party/blink/renderer/core/css/css_syntax_descriptor.h
@@ -24,13 +24,6 @@
     return syntax_components_.size() == 1 &&
            syntax_components_[0].GetType() == CSSSyntaxType::kTokenStream;
   }
-  bool HasUrlSyntax() const {
-    for (const CSSSyntaxComponent& component : syntax_components_) {
-      if (component.GetType() == CSSSyntaxType::kUrl)
-        return true;
-    }
-    return false;
-  }
   const Vector<CSSSyntaxComponent>& Components() const {
     return syntax_components_;
   }
diff --git a/third_party/blink/renderer/core/css/css_uri_value.cc b/third_party/blink/renderer/core/css/css_uri_value.cc
index ac64150..b1078fef 100644
--- a/third_party/blink/renderer/core/css/css_uri_value.cc
+++ b/third_party/blink/renderer/core/css/css_uri_value.cc
@@ -69,6 +69,15 @@
   return absolute_url_ == other.absolute_url_;
 }
 
+CSSURIValue* CSSURIValue::ValueWithURLMadeAbsolute(
+    const KURL& base_url,
+    const WTF::TextEncoding& charset) const {
+  if (!charset.IsValid())
+    return Create(AtomicString(KURL(base_url, relative_url_).GetString()));
+  return Create(
+      AtomicString(KURL(base_url, relative_url_, charset).GetString()));
+}
+
 void CSSURIValue::TraceAfterDispatch(blink::Visitor* visitor) {
   visitor->Trace(resource_);
   CSSValue::TraceAfterDispatch(visitor);
diff --git a/third_party/blink/renderer/core/css/css_uri_value.h b/third_party/blink/renderer/core/css/css_uri_value.h
index 3614f1b..e49901f 100644
--- a/third_party/blink/renderer/core/css/css_uri_value.h
+++ b/third_party/blink/renderer/core/css/css_uri_value.h
@@ -7,6 +7,7 @@
 
 #include "third_party/blink/renderer/core/css/css_value.h"
 #include "third_party/blink/renderer/platform/wtf/casting.h"
+#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
 
 namespace blink {
@@ -17,7 +18,7 @@
 
 namespace cssvalue {
 
-class CSSURIValue : public CSSValue {
+class CORE_EXPORT CSSURIValue : public CSSValue {
  public:
   static CSSURIValue* Create(const String& relative_url, const KURL& url) {
     return MakeGarbageCollected<CSSURIValue>(AtomicString(relative_url), url);
@@ -45,6 +46,9 @@
 
   bool Equals(const CSSURIValue&) const;
 
+  CSSURIValue* ValueWithURLMadeAbsolute(const KURL& base_url,
+                                        const WTF::TextEncoding&) const;
+
   void TraceAfterDispatch(blink::Visitor*);
 
  private:
diff --git a/third_party/blink/renderer/core/css/css_uri_value_test.cc b/third_party/blink/renderer/core/css/css_uri_value_test.cc
new file mode 100644
index 0000000..346cb7b
--- /dev/null
+++ b/third_party/blink/renderer/core/css/css_uri_value_test.cc
@@ -0,0 +1,32 @@
+// 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 "third_party/blink/renderer/core/css/css_uri_value.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include "third_party/blink/renderer/platform/weborigin/kurl.h"
+
+namespace blink {
+namespace {
+
+using namespace cssvalue;
+
+TEST(CSSURIValueTest, ValueWithURLMadeAbsolute) {
+  CSSURIValue* rel = CSSURIValue::Create("a", KURL("http://foo.com/a"));
+  CSSURIValue* abs = rel->ValueWithURLMadeAbsolute(KURL("http://bar.com"),
+                                                   WTF::TextEncoding());
+  EXPECT_EQ("url(\"http://bar.com/a\")", abs->CssText());
+}
+
+TEST(CSSURIValueTest, AlreadyAbsoluteURLMadeAbsolute) {
+  CSSURIValue* rel =
+      CSSURIValue::Create("http://baz.com/a", KURL("http://baz.com/a"));
+  CSSURIValue* abs = rel->ValueWithURLMadeAbsolute(KURL("http://bar.com"),
+                                                   WTF::TextEncoding());
+  EXPECT_EQ("url(\"http://baz.com/a\")", abs->CssText());
+}
+
+}  // namespace
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/css_variable_data.cc b/third_party/blink/renderer/core/css/css_variable_data.cc
index e77d7fd..2ecf2e0a 100644
--- a/third_party/blink/renderer/core/css/css_variable_data.cc
+++ b/third_party/blink/renderer/core/css/css_variable_data.cc
@@ -63,8 +63,6 @@
     CSSParserToken token = local_range.Consume();
     if (token.HasStringBacking())
       string_builder.Append(token.Value());
-    needs_url_resolution_ |= (token.GetType() == kUrlToken ||
-                              token.FunctionId() == CSSValueID::kUrl);
     has_font_units_ |= IsFontUnitToken(token);
     has_root_font_units_ |= IsRootFontUnitToken(token);
   }
@@ -83,7 +81,6 @@
                                  const WTF::TextEncoding& charset)
     : is_animation_tainted_(is_animation_tainted),
       needs_variable_resolution_(needs_variable_resolution),
-      needs_url_resolution_(needs_variable_resolution_),
       has_font_units_(false),
       has_root_font_units_(false),
       absolutized_(false),
diff --git a/third_party/blink/renderer/core/css/css_variable_data.h b/third_party/blink/renderer/core/css/css_variable_data.h
index a630a7d0..9f278b6 100644
--- a/third_party/blink/renderer/core/css/css_variable_data.h
+++ b/third_party/blink/renderer/core/css/css_variable_data.h
@@ -43,10 +43,12 @@
       bool is_animation_tainted,
       bool has_font_units,
       bool has_root_font_units,
-      bool absolutized) {
+      bool absolutized,
+      const String& base_url,
+      const WTF::TextEncoding& charset) {
     return base::AdoptRef(new CSSVariableData(
         resolved_tokens, std::move(backing_strings), is_animation_tainted,
-        has_font_units, has_root_font_units, absolutized));
+        has_font_units, has_root_font_units, absolutized, base_url, charset));
   }
 
   CSSParserTokenRange TokenRange() const { return tokens_; }
@@ -60,8 +62,6 @@
 
   bool NeedsVariableResolution() const { return needs_variable_resolution_; }
 
-  bool NeedsUrlResolution() const { return needs_url_resolution_; }
-
   // True if the CSSVariableData has tokens with units that are relative to the
   // font-size of the current element, e.g. 'em'.
   bool HasFontUnits() const { return has_font_units_; }
@@ -85,7 +85,6 @@
   CSSVariableData()
       : is_animation_tainted_(false),
         needs_variable_resolution_(false),
-        needs_url_resolution_(false),
         has_font_units_(false),
         has_root_font_units_(false),
         absolutized_(false) {}
@@ -101,15 +100,18 @@
                   bool is_animation_tainted,
                   bool has_font_units,
                   bool has_root_font_units,
-                  bool absolutized)
+                  bool absolutized,
+                  const String& base_url,
+                  const WTF::TextEncoding& charset)
       : backing_strings_(std::move(backing_strings)),
         tokens_(resolved_tokens),
         is_animation_tainted_(is_animation_tainted),
         needs_variable_resolution_(false),
-        needs_url_resolution_(false),
         has_font_units_(has_font_units),
         has_root_font_units_(has_root_font_units),
-        absolutized_(absolutized) {}
+        absolutized_(absolutized),
+        base_url_(base_url),
+        charset_(charset) {}
 
   void ConsumeAndUpdateTokens(const CSSParserTokenRange&);
 
@@ -120,7 +122,6 @@
   Vector<CSSParserToken> tokens_;
   const bool is_animation_tainted_;
   const bool needs_variable_resolution_;
-  bool needs_url_resolution_;
   bool has_font_units_;
   bool has_root_font_units_;
   bool absolutized_;
diff --git a/third_party/blink/renderer/core/css/properties/README.md b/third_party/blink/renderer/core/css/properties/README.md
index 4083ed4..f7af022 100644
--- a/third_party/blink/renderer/core/css/properties/README.md
+++ b/third_party/blink/renderer/core/css/properties/README.md
@@ -36,7 +36,8 @@
 Alias classes, longhand classes, and shorthand classes each represent a single
 CSS property and are named after that property. These property classes are
 partially generated (<PropertyName\>.h and for some properties
-<PropertyName\>.cpp), and partially hand written (<PropertyName\>Custom.cpp).
+<PropertyName\>.cpp), and partially hand written (in shorthands_custom.cc or
+longhands_custom.cc).
 
 
 ## Special property classes
diff --git a/third_party/blink/renderer/core/css/properties/longhands/align_content_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/align_content_custom.cc
deleted file mode 100644
index 3ffafa1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/align_content_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/align_content.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AlignContent::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeContentDistributionOverflowPosition(
-      range, css_parsing_utils::IsContentPositionKeyword);
-}
-
-const CSSValue* AlignContent::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::
-      ValueForContentPositionAndDistributionWithOverflowAlignment(
-          style.AlignContent());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/align_items_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/align_items_custom.cc
deleted file mode 100644
index 3f4cdff..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/align_items_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/align_items.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AlignItems::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // align-items property does not allow the 'auto' value.
-  if (css_property_parser_helpers::IdentMatches<CSSValueID::kAuto>(
-          range.Peek().Id()))
-    return nullptr;
-  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
-      range, css_parsing_utils::IsSelfPositionKeyword);
-}
-
-const CSSValue* AlignItems::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
-      style.AlignItems());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/align_self_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/align_self_custom.cc
deleted file mode 100644
index 9565047..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/align_self_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/align_self.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AlignSelf::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
-      range, css_parsing_utils::IsSelfPositionKeyword);
-}
-
-const CSSValue* AlignSelf::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
-      style.AlignSelf());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/alignment_baseline_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/alignment_baseline_custom.cc
deleted file mode 100644
index 6ee34f48..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/alignment_baseline_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/alignment_baseline.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AlignmentBaseline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.AlignmentBaseline());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_delay_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_delay_custom.cc
deleted file mode 100644
index 06dfd29..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_delay_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_delay.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationDelay::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeTime, range, kValueRangeAll);
-}
-
-const CSSValue* AnimationDelay::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationDelay(style.Animations());
-}
-
-const CSSValue* AnimationDelay::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSValue>, value,
-      (CSSPrimitiveValue::Create(CSSTimingData::InitialDelay(),
-                                 CSSPrimitiveValue::UnitType::kSeconds)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_direction_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_direction_custom.cc
deleted file mode 100644
index afece0d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_direction_custom.cc
+++ /dev/null
@@ -1,52 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_direction.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationDirection::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kNormal, CSSValueID::kAlternate, CSSValueID::kReverse,
-          CSSValueID::kAlternateReverse>,
-      range);
-}
-
-const CSSValue* AnimationDirection::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    for (wtf_size_t i = 0; i < animation_data->DirectionList().size(); ++i) {
-      list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
-          animation_data->DirectionList()[i]));
-    }
-  } else {
-    list->Append(*InitialValue());
-  }
-  return list;
-}
-
-const CSSValue* AnimationDirection::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kNormal)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_duration_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_duration_custom.cc
deleted file mode 100644
index 5158fb34..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_duration_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_duration.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationDuration::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeTime, range, kValueRangeNonNegative);
-}
-
-const CSSValue* AnimationDuration::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationDuration(style.Animations());
-}
-
-const CSSValue* AnimationDuration::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSValue>, value,
-      (CSSPrimitiveValue::Create(CSSTimingData::InitialDuration(),
-                                 CSSPrimitiveValue::UnitType::kSeconds)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_fill_mode_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_fill_mode_custom.cc
deleted file mode 100644
index b60de34..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_fill_mode_custom.cc
+++ /dev/null
@@ -1,52 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_fill_mode.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationFillMode::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kNone, CSSValueID::kForwards, CSSValueID::kBackwards,
-          CSSValueID::kBoth>,
-      range);
-}
-
-const CSSValue* AnimationFillMode::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    for (wtf_size_t i = 0; i < animation_data->FillModeList().size(); ++i) {
-      list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
-          animation_data->FillModeList()[i]));
-    }
-  } else {
-    list->Append(*InitialValue());
-  }
-  return list;
-}
-
-const CSSValue* AnimationFillMode::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_iteration_count_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_iteration_count_custom.cc
deleted file mode 100644
index b0eaa447..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_iteration_count_custom.cc
+++ /dev/null
@@ -1,53 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_iteration_count.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationIterationCount::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeAnimationIterationCount, range);
-}
-
-const CSSValue* AnimationIterationCount::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    for (wtf_size_t i = 0; i < animation_data->IterationCountList().size();
-         ++i) {
-      list->Append(*ComputedStyleUtils::ValueForAnimationIterationCount(
-          animation_data->IterationCountList()[i]));
-    }
-  } else {
-    list->Append(*InitialValue());
-  }
-  return list;
-}
-
-const CSSValue* AnimationIterationCount::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSValue>, value,
-      (CSSPrimitiveValue::Create(CSSAnimationData::InitialIterationCount(),
-                                 CSSPrimitiveValue::UnitType::kNumber)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_name_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_name_custom.cc
deleted file mode 100644
index ab9ad3e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_name_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_name.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationName::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  // Allow quoted name if this is an alias property.
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeAnimationName, range, context,
-      local_context.UseAliasParsing());
-}
-
-const CSSValue* AnimationName::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) {
-      list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
-          animation_data->NameList()[i]));
-    }
-  } else {
-    list->Append(*InitialValue());
-  }
-  return list;
-}
-
-const CSSValue* AnimationName::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_play_state_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_play_state_custom.cc
deleted file mode 100644
index b2a238a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_play_state_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_play_state.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationPlayState::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kRunning,
-                                                CSSValueID::kPaused>,
-      range);
-}
-
-const CSSValue* AnimationPlayState::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    for (wtf_size_t i = 0; i < animation_data->PlayStateList().size(); ++i) {
-      list->Append(*ComputedStyleUtils::ValueForAnimationPlayState(
-          animation_data->PlayStateList()[i]));
-    }
-  } else {
-    list->Append(*InitialValue());
-  }
-  return list;
-}
-
-const CSSValue* AnimationPlayState::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kRunning)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/animation_timing_function_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/animation_timing_function_custom.cc
deleted file mode 100644
index ed89c48..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/animation_timing_function_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/animation_timing_function.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* AnimationTimingFunction::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeAnimationTimingFunction, range);
-}
-
-const CSSValue* AnimationTimingFunction::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationTimingFunction(
-      style.Animations());
-}
-
-const CSSValue* AnimationTimingFunction::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kEase)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/backdrop_filter_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/backdrop_filter_custom.cc
deleted file mode 100644
index 50302fd..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/backdrop_filter_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/backdrop_filter.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackdropFilter::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeFilterFunctionList(range, context);
-}
-
-const CSSValue* BackdropFilter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFilter(style, style.BackdropFilter());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/backface_visibility_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/backface_visibility_custom.cc
deleted file mode 100644
index 79dc4c9c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/backface_visibility_custom.cc
+++ /dev/null
@@ -1,23 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/backface_visibility.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackfaceVisibility::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(
-      (style.BackfaceVisibility() == EBackfaceVisibility::kHidden)
-          ? CSSValueID::kHidden
-          : CSSValueID::kVisible);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_attachment_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_attachment_custom.cc
deleted file mode 100644
index e059133..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_attachment_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_attachment.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundAttachment::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeBackgroundAttachment, range);
-}
-
-const CSSValue* BackgroundAttachment::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (const FillLayer* curr_layer = &style.BackgroundLayers(); curr_layer;
-       curr_layer = curr_layer->Next())
-    list->Append(*CSSIdentifierValue::Create(curr_layer->Attachment()));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_blend_mode_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_blend_mode_custom.cc
deleted file mode 100644
index 08417ec..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_blend_mode_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_blend_mode.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundBlendMode::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeBackgroundBlendMode, range);
-}
-
-const CSSValue* BackgroundBlendMode::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (const FillLayer* curr_layer = &style.BackgroundLayers(); curr_layer;
-       curr_layer = curr_layer->Next())
-    list->Append(*CSSIdentifierValue::Create(curr_layer->GetBlendMode()));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc
deleted file mode 100644
index a2e80e5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_clip_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_clip.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundClip::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBackgroundBox(
-      range, local_context, css_parsing_utils::AllowTextValue::kAllow);
-}
-
-const CSSValue* BackgroundClip::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const FillLayer* curr_layer = &style.BackgroundLayers();
-  for (; curr_layer; curr_layer = curr_layer->Next()) {
-    EFillBox box = curr_layer->Clip();
-    list->Append(*CSSIdentifierValue::Create(box));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_color_custom.cc
deleted file mode 100644
index 1fb8f509..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_color_custom.cc
+++ /dev/null
@@ -1,61 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_mode.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(
-      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
-}
-
-const blink::Color BackgroundColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor style_color = visited_link ? style.VisitedLinkBackgroundColor()
-                                        : style.BackgroundColor();
-  blink::Color result =
-      visited_link ? style.VisitedLinkColor() : style.GetColor();
-  if (!style_color.IsCurrentColor())
-    result = style_color.GetColor();
-
-  // FIXME: Technically someone could explicitly specify the color transparent,
-  // but for now we'll just assume that if the background color is transparent
-  // that it wasn't set. Note that it's weird that we're returning unvisited
-  // info for a visited link, but given our restriction that the alpha values
-  // have to match, it makes more sense to return the unvisited background color
-  // if specified than it does to return black. This behavior matches what
-  // Firefox 4 does as well.
-  if (visited_link && result == blink::Color::kTransparent)
-    return ColorIncludingFallback(false, style);
-
-  return result;
-}
-
-const CSSValue* BackgroundColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.BackgroundColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_image_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_image_custom.cc
deleted file mode 100644
index bc8afb10..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_image_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_image.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundImage::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeImageOrNone, range, &context);
-}
-
-const CSSValue* BackgroundImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer& fill_layer = style.BackgroundLayers();
-  return ComputedStyleUtils::BackgroundImageOrWebkitMaskImage(fill_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc
deleted file mode 100644
index 3b076d9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_origin_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_origin.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundOrigin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBackgroundBox(
-      range, local_context, css_parsing_utils::AllowTextValue::kForbid);
-}
-
-const CSSValue* BackgroundOrigin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const FillLayer* curr_layer = &style.BackgroundLayers();
-  for (; curr_layer; curr_layer = curr_layer->Next()) {
-    EFillBox box = curr_layer->Origin();
-    list->Append(*CSSIdentifierValue::Create(box));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_position_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_position_x_custom.cc
deleted file mode 100644
index 54930de..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_position_x_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_position_x.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundPositionX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
-                                                 CSSValueID::kRight>,
-      range, context.Mode());
-}
-
-const CSSValue* BackgroundPositionX::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer* curr_layer = &style.BackgroundLayers();
-  return ComputedStyleUtils::BackgroundPositionXOrWebkitMaskPositionX(
-      style, curr_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_position_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_position_y_custom.cc
deleted file mode 100644
index 31ab5d44..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_position_y_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_position_y.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundPositionY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
-                                                 CSSValueID::kBottom>,
-      range, context.Mode());
-}
-
-const CSSValue* BackgroundPositionY::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer* curr_layer = &style.BackgroundLayers();
-  return ComputedStyleUtils::BackgroundPositionYOrWebkitMaskPositionY(
-      style, curr_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/background_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/background_size_custom.cc
deleted file mode 100644
index c426a54d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/background_size_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/background_size.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BackgroundSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBackgroundOrMaskSize(
-      range, context, local_context, WebFeature::kNegativeBackgroundSize);
-}
-
-const CSSValue* BackgroundSize::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer& fill_layer = style.BackgroundLayers();
-  return ComputedStyleUtils::BackgroundImageOrWebkitMaskSize(style, fill_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/baseline_shift_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/baseline_shift_custom.cc
deleted file mode 100644
index 75ac944..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/baseline_shift_custom.cc
+++ /dev/null
@@ -1,83 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/baseline_shift.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BaselineShift::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kBaseline || id == CSSValueID::kSub ||
-      id == CSSValueID::kSuper)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll);
-}
-
-const CSSValue* BaselineShift::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  switch (svg_style.BaselineShift()) {
-    case BS_SUPER:
-      return CSSIdentifierValue::Create(CSSValueID::kSuper);
-    case BS_SUB:
-      return CSSIdentifierValue::Create(CSSValueID::kSub);
-    case BS_LENGTH:
-      return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-          svg_style.BaselineShiftValue(), style);
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
-void BaselineShift::ApplyInherit(StyleResolverState& state) const {
-  const SVGComputedStyle& parent_svg_style = state.ParentStyle()->SvgStyle();
-  EBaselineShift baseline_shift = parent_svg_style.BaselineShift();
-  SVGComputedStyle& svg_style = state.Style()->AccessSVGStyle();
-  svg_style.SetBaselineShift(baseline_shift);
-  if (baseline_shift == BS_LENGTH)
-    svg_style.SetBaselineShiftValue(parent_svg_style.BaselineShiftValue());
-}
-
-void BaselineShift::ApplyValue(StyleResolverState& state,
-                               const CSSValue& value) const {
-  SVGComputedStyle& svg_style = state.Style()->AccessSVGStyle();
-  auto* identifier_value = DynamicTo<CSSIdentifierValue>(value);
-  if (!identifier_value) {
-    svg_style.SetBaselineShift(BS_LENGTH);
-    svg_style.SetBaselineShiftValue(StyleBuilderConverter::ConvertLength(
-        state, To<CSSPrimitiveValue>(value)));
-    return;
-  }
-  switch (identifier_value->GetValueID()) {
-    case CSSValueID::kBaseline:
-      svg_style.SetBaselineShift(BS_LENGTH);
-      svg_style.SetBaselineShiftValue(Length::Fixed());
-      return;
-    case CSSValueID::kSub:
-      svg_style.SetBaselineShift(BS_SUB);
-      return;
-    case CSSValueID::kSuper:
-      svg_style.SetBaselineShift(BS_SUPER);
-      return;
-    default:
-      NOTREACHED();
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/block_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/block_size_custom.cc
deleted file mode 100644
index 56bba6c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/block_size_custom.cc
+++ /dev/null
@@ -1,27 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/block_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
-}
-
-bool BlockSize::IsLayoutDependent(const ComputedStyle* style,
-                                  LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_block_end_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_block_end_color_custom.cc
deleted file mode 100644
index f6639270..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_block_end_color_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_block_end_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* BorderBlockEndColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_block_end_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_block_end_width_custom.cc
deleted file mode 100644
index e57415d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_block_end_width_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_block_end_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBlockEndWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_block_start_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_block_start_color_custom.cc
deleted file mode 100644
index ea96b89..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_block_start_color_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_block_start_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* BorderBlockStartColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_block_start_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_block_start_width_custom.cc
deleted file mode 100644
index 8a15fcbc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_block_start_width_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_block_start_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBlockStartWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_bottom_color_custom.cc
deleted file mode 100644
index 1935e6a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_color_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserContext;
-class CSSParserLocalContext;
-class CSSParserTokenRange;
-
-namespace css_longhand {
-
-const CSSValue* BorderBottomColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeBorderColorSide(range, context,
-                                                   local_context);
-}
-
-const blink::Color BorderBottomColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkBorderBottomColor()
-                                   : style.BorderBottomColor();
-  EBorderStyle border_style = style.BorderBottomStyle();
-  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
-                                             visited_link);
-}
-
-const CSSValue* BorderBottomColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.BorderBottomColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_left_radius_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_bottom_left_radius_custom.cc
deleted file mode 100644
index 791b4cdc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_left_radius_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_left_radius.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBottomLeftRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
-}
-
-const CSSValue* BorderBottomLeftRadius::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
-      style.BorderBottomLeftRadius(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_right_radius_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_bottom_right_radius_custom.cc
deleted file mode 100644
index 1eb8d4e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_right_radius_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_right_radius.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBottomRightRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
-}
-
-const CSSValue* BorderBottomRightRadius::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
-      style.BorderBottomRightRadius(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_bottom_style_custom.cc
deleted file mode 100644
index 5b1894c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_style_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBottomStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BorderBottomStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_bottom_width_custom.cc
deleted file mode 100644
index 253c9b07..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_bottom_width_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderBottomWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
-}
-
-const CSSValue* BorderBottomWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.BorderBottomWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_collapse_custom.cc
deleted file mode 100644
index dbccd58..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_collapse_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_collapse.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderCollapse::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.BorderCollapse() == EBorderCollapse::kCollapse)
-    return CSSIdentifierValue::Create(CSSValueID::kCollapse);
-  return CSSIdentifierValue::Create(CSSValueID::kSeparate);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_image_outset_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_image_outset_custom.cc
deleted file mode 100644
index e0f12599..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_image_outset_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_image_outset.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderImageOutset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageOutset(range);
-}
-
-const CSSValue* BorderImageOutset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageQuad(
-      style.BorderImage().Outset(), style);
-}
-
-const CSSValue* BorderImageOutset::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSQuadValue>, value,
-      (CSSQuadValue::Create(
-          CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kInteger),
-          CSSQuadValue::kSerializeAsQuad)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_image_repeat_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_image_repeat_custom.cc
deleted file mode 100644
index 9a704b85..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_image_repeat_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_image_repeat.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderImageRepeat::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageRepeat(range);
-}
-
-const CSSValue* BorderImageRepeat::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageRepeat(style.BorderImage());
-}
-
-const CSSValue* BorderImageRepeat::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kStretch)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_image_slice_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_image_slice_custom.cc
deleted file mode 100644
index b4d41c0d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_image_slice_custom.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_image_slice.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderImageSlice::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageSlice(
-      range, css_parsing_utils::DefaultFill::kNoFill);
-}
-
-const CSSValue* BorderImageSlice::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageSlice(style.BorderImage());
-}
-
-const CSSValue* BorderImageSlice::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSBorderImageSliceValue>, value,
-      (MakeGarbageCollected<CSSBorderImageSliceValue>(
-          CSSQuadValue::Create(
-              CSSPrimitiveValue::Create(
-                  100, CSSPrimitiveValue::UnitType::kPercentage),
-              CSSQuadValue::kSerializeAsQuad),
-          /* fill */ false)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_image_source_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_image_source_custom.cc
deleted file mode 100644
index f3a684f4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_image_source_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_image_source.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* BorderImageSource::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
-}
-
-const CSSValue* BorderImageSource::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  if (style.BorderImageSource())
-    return style.BorderImageSource()->ComputedCSSValue();
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-const CSSValue* BorderImageSource::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
-  return value;
-}
-
-void BorderImageSource::ApplyValue(StyleResolverState& state,
-                                   const CSSValue& value) const {
-  state.Style()->SetBorderImageSource(
-      state.GetStyleImage(CSSPropertyID::kBorderImageSource, value));
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_image_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_image_width_custom.cc
deleted file mode 100644
index cbf66971..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_image_width_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_image_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderImageWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageWidth(range);
-}
-
-const CSSValue* BorderImageWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageQuad(
-      style.BorderImage().BorderSlices(), style);
-}
-
-const CSSValue* BorderImageWidth::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSQuadValue>, value,
-      (CSSQuadValue::Create(
-          CSSPrimitiveValue::Create(1, CSSPrimitiveValue::UnitType::kInteger),
-          CSSQuadValue::kSerializeAsQuad)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_color_custom.cc
deleted file mode 100644
index 4a76f43..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_color_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_end_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* BorderInlineEndColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_width_custom.cc
deleted file mode 100644
index ce62e09e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_inline_end_width_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_end_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderInlineEndWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_color_custom.cc
deleted file mode 100644
index 35c9084..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_color_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_start_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* BorderInlineStartColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_width_custom.cc
deleted file mode 100644
index a9cdb5f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_inline_start_width_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_start_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderInlineStartWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_left_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_left_color_custom.cc
deleted file mode 100644
index 899c48f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_left_color_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_left_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserContext;
-class CSSParserLocalContext;
-class CSSParserTokenRange;
-
-namespace css_longhand {
-
-const CSSValue* BorderLeftColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeBorderColorSide(range, context,
-                                                   local_context);
-}
-
-const blink::Color BorderLeftColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkBorderLeftColor()
-                                   : style.BorderLeftColor();
-  EBorderStyle border_style = style.BorderLeftStyle();
-  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
-                                             visited_link);
-}
-
-const CSSValue* BorderLeftColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.BorderLeftColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_left_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_left_style_custom.cc
deleted file mode 100644
index eca1f56..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_left_style_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_left_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderLeftStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BorderLeftStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_left_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_left_width_custom.cc
deleted file mode 100644
index cccc0450..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_left_width_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_left_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderLeftWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
-}
-
-const CSSValue* BorderLeftWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.BorderLeftWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_right_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_right_color_custom.cc
deleted file mode 100644
index 5adefc6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_right_color_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_right_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserContext;
-class CSSParserLocalContext;
-class CSSParserTokenRange;
-
-namespace css_longhand {
-
-const CSSValue* BorderRightColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeBorderColorSide(range, context,
-                                                   local_context);
-}
-
-const blink::Color BorderRightColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkBorderRightColor()
-                                   : style.BorderRightColor();
-  EBorderStyle border_style = style.BorderRightStyle();
-  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
-                                             visited_link);
-}
-
-const CSSValue* BorderRightColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.BorderRightColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_right_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_right_style_custom.cc
deleted file mode 100644
index bb8bcde..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_right_style_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_right_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderRightStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BorderRightStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_right_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_right_width_custom.cc
deleted file mode 100644
index 9850f28e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_right_width_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_right_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderRightWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
-}
-
-const CSSValue* BorderRightWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.BorderRightWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_top_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_top_color_custom.cc
deleted file mode 100644
index 10319b50..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_top_color_custom.cc
+++ /dev/null
@@ -1,52 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_top_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserContext;
-class CSSParserLocalContext;
-class CSSParserTokenRange;
-
-namespace css_longhand {
-
-const CSSValue* BorderTopColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeBorderColorSide(range, context,
-                                                   local_context);
-}
-
-const blink::Color BorderTopColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result =
-      visited_link ? style.VisitedLinkBorderTopColor() : style.BorderTopColor();
-  EBorderStyle border_style = style.BorderTopStyle();
-  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
-                                             visited_link);
-}
-
-const CSSValue* BorderTopColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style
-             ? cssvalue::CSSColorValue::Create(
-                   style.VisitedDependentColor(*this).Rgb())
-             : ComputedStyleUtils::ComputedStyleUtils::CurrentColorOrValidColor(
-                   style, style.BorderTopColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_top_left_radius_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_top_left_radius_custom.cc
deleted file mode 100644
index 7c01a8a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_top_left_radius_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_top_left_radius.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderTopLeftRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
-}
-
-const CSSValue* BorderTopLeftRadius::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
-      style.BorderTopLeftRadius(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_top_right_radius_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_top_right_radius_custom.cc
deleted file mode 100644
index 723f400..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_top_right_radius_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_top_right_radius.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderTopRightRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
-}
-
-const CSSValue* BorderTopRightRadius::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
-      style.BorderTopRightRadius(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_top_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_top_style_custom.cc
deleted file mode 100644
index e00e4d0a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_top_style_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_top_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderTopStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BorderTopStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/border_top_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/border_top_width_custom.cc
deleted file mode 100644
index 86419951..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/border_top_width_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/border_top_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BorderTopWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
-}
-
-const CSSValue* BorderTopWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.BorderTopWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/bottom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/bottom_custom.cc
deleted file mode 100644
index bed946f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/bottom_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* Bottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_parsing_utils::UnitlessUnlessShorthand(local_context));
-}
-
-bool Bottom::IsLayoutDependent(const ComputedStyle* style,
-                               LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* Bottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
-                                                    layout_object);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/box_shadow_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/box_shadow_custom.cc
deleted file mode 100644
index 0004a5d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/box_shadow_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/box_shadow.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BoxShadow::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeShadow(
-      range, context.Mode(), css_parsing_utils::AllowInsetAndSpread::kAllow);
-}
-
-const CSSValue* BoxShadow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForShadowList(style.BoxShadow(), style, true);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/box_sizing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/box_sizing_custom.cc
deleted file mode 100644
index b7dfdda6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/box_sizing_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/box_sizing.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BoxSizing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.BoxSizing() == EBoxSizing::kContentBox)
-    return CSSIdentifierValue::Create(CSSValueID::kContentBox);
-  return CSSIdentifierValue::Create(CSSValueID::kBorderBox);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/break_after_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/break_after_custom.cc
deleted file mode 100644
index fdf5814..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/break_after_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/break_after.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BreakAfter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BreakAfter());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/break_before_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/break_before_custom.cc
deleted file mode 100644
index 7626cb7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/break_before_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/break_before.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BreakBefore::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BreakBefore());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/break_inside_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/break_inside_custom.cc
deleted file mode 100644
index 36c675b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/break_inside_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/break_inside.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BreakInside::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BreakInside());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/buffered_rendering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/buffered_rendering_custom.cc
deleted file mode 100644
index a65e2fb8..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/buffered_rendering_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/buffered_rendering.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* BufferedRendering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.BufferedRendering());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/caption_side_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/caption_side_custom.cc
deleted file mode 100644
index 2617588..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/caption_side_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/caption_side.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* CaptionSide::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.CaptionSide());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/caret_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/caret_color_custom.cc
deleted file mode 100644
index 1cd66f6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/caret_color_custom.cc
+++ /dev/null
@@ -1,84 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/caret_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* CaretColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color CaretColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleAutoColor auto_color =
-      visited_link ? style.VisitedLinkCaretColor() : style.CaretColor();
-  // TODO(rego): We may want to adjust the caret color if it's the same as
-  // the background to ensure good visibility and contrast.
-  StyleColor result = auto_color.IsAutoColor() ? StyleColor::CurrentColor()
-                                               : auto_color.ToStyleColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* CaretColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  blink::Color color;
-  if (allow_visited_style)
-    color = style.VisitedDependentColor(*this);
-  else if (style.CaretColor().IsAutoColor())
-    color = StyleColor::CurrentColor().Resolve(style.GetColor());
-  else
-    color = style.CaretColor().ToStyleColor().Resolve(style.GetColor());
-  return cssvalue::CSSColorValue::Create(color.Rgb());
-}
-
-void CaretColor::ApplyInitial(StyleResolverState& state) const {
-  StyleAutoColor color = StyleAutoColor::AutoColor();
-  if (state.ApplyPropertyToRegularStyle())
-    state.Style()->SetCaretColor(color);
-  if (state.ApplyPropertyToVisitedLinkStyle())
-    state.Style()->SetVisitedLinkCaretColor(color);
-}
-
-void CaretColor::ApplyInherit(StyleResolverState& state) const {
-  StyleAutoColor color = state.ParentStyle()->CaretColor();
-  if (state.ApplyPropertyToRegularStyle())
-    state.Style()->SetCaretColor(color);
-  if (state.ApplyPropertyToVisitedLinkStyle())
-    state.Style()->SetVisitedLinkCaretColor(color);
-}
-
-void CaretColor::ApplyValue(StyleResolverState& state,
-                            const CSSValue& value) const {
-  if (state.ApplyPropertyToRegularStyle()) {
-    state.Style()->SetCaretColor(
-        StyleBuilderConverter::ConvertStyleAutoColor(state, value));
-  }
-  if (state.ApplyPropertyToVisitedLinkStyle()) {
-    state.Style()->SetVisitedLinkCaretColor(
-        StyleBuilderConverter::ConvertStyleAutoColor(state, value, true));
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc
deleted file mode 100644
index 2378439..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/clear_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/clear.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Clear::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Clear());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/clip_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/clip_custom.cc
deleted file mode 100644
index 1e452dd..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/clip_custom.cc
+++ /dev/null
@@ -1,83 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/clip.h"
-
-#include "third_party/blink/renderer/core/css/css_quad_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace {
-
-CSSValue* ConsumeClipComponent(CSSParserTokenRange& range,
-                               CSSParserMode css_parser_mode) {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeLength(
-      range, css_parser_mode, kValueRangeAll,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* Clip::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  if (range.Peek().FunctionId() != CSSValueID::kRect)
-    return nullptr;
-
-  CSSParserTokenRange args =
-      css_property_parser_helpers::ConsumeFunction(range);
-  // rect(t, r, b, l) || rect(t r b l)
-  CSSValue* top = ConsumeClipComponent(args, context.Mode());
-  if (!top)
-    return nullptr;
-  bool needs_comma =
-      css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args);
-  CSSValue* right = ConsumeClipComponent(args, context.Mode());
-  if (!right ||
-      (needs_comma &&
-       !css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)))
-    return nullptr;
-  CSSValue* bottom = ConsumeClipComponent(args, context.Mode());
-  if (!bottom ||
-      (needs_comma &&
-       !css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)))
-    return nullptr;
-  CSSValue* left = ConsumeClipComponent(args, context.Mode());
-  if (!left || !args.AtEnd())
-    return nullptr;
-  return MakeGarbageCollected<CSSQuadValue>(top, right, bottom, left,
-                                            CSSQuadValue::kSerializeAsRect);
-}
-
-const CSSValue* Clip::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HasAutoClip())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  CSSValue* top = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
-      style.Clip().Top(), style);
-  CSSValue* right = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
-      style.Clip().Right(), style);
-  CSSValue* bottom = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
-      style.Clip().Bottom(), style);
-  CSSValue* left = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
-      style.Clip().Left(), style);
-  return MakeGarbageCollected<CSSQuadValue>(top, right, bottom, left,
-                                            CSSQuadValue::kSerializeAsRect);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/clip_path_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/clip_path_custom.cc
deleted file mode 100644
index 57b048d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/clip_path_custom.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/clip_path.h"
-
-#include "third_party/blink/renderer/core/css/basic_shape_functions.h"
-#include "third_party/blink/renderer/core/css/css_uri_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style/reference_clip_path_operation.h"
-#include "third_party/blink/renderer/core/style/shape_clip_path_operation.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ClipPath::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
-                                           const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  if (cssvalue::CSSURIValue* url =
-          css_property_parser_helpers::ConsumeUrl(range, &context))
-    return url;
-  return css_parsing_utils::ConsumeBasicShape(range, context);
-}
-
-const CSSValue* ClipPath::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (ClipPathOperation* operation = style.ClipPath()) {
-    if (operation->GetType() == ClipPathOperation::SHAPE) {
-      return ValueForBasicShape(
-          style, To<ShapeClipPathOperation>(operation)->GetBasicShape());
-    }
-    if (operation->GetType() == ClipPathOperation::REFERENCE) {
-      return cssvalue::CSSURIValue::Create(
-          To<ReferenceClipPathOperation>(operation)->Url());
-    }
-  }
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/clip_rule_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/clip_rule_custom.cc
deleted file mode 100644
index dbdb989..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/clip_rule_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/clip_rule.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ClipRule::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.ClipRule());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/color_custom.cc
deleted file mode 100644
index 14a0b2dd..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/color_custom.cc
+++ /dev/null
@@ -1,78 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_mode.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Color::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(
-      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
-}
-
-const blink::Color Color::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result =
-      visited_link ? style.VisitedLinkColor() : style.GetColor();
-  ;
-  return result.GetColor();
-}
-
-const CSSValue* Color::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return cssvalue::CSSColorValue::Create(
-      allow_visited_style ? style.VisitedDependentColor(*this).Rgb()
-                          : style.GetColor().Rgb());
-}
-
-void Color::ApplyInitial(StyleResolverState& state) const {
-  blink::Color color = ComputedStyleInitialValues::InitialColor();
-  if (state.ApplyPropertyToRegularStyle())
-    state.Style()->SetColor(color);
-  if (state.ApplyPropertyToVisitedLinkStyle())
-    state.Style()->SetVisitedLinkColor(color);
-}
-
-void Color::ApplyInherit(StyleResolverState& state) const {
-  blink::Color color = state.ParentStyle()->GetColor();
-  if (state.ApplyPropertyToRegularStyle())
-    state.Style()->SetColor(color);
-  if (state.ApplyPropertyToVisitedLinkStyle())
-    state.Style()->SetVisitedLinkColor(color);
-}
-
-void Color::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
-  // As per the spec, 'color: currentColor' is treated as 'color: inherit'
-  auto* identifier_value = DynamicTo<CSSIdentifierValue>(value);
-  if (identifier_value &&
-      identifier_value->GetValueID() == CSSValueID::kCurrentcolor) {
-    ApplyInherit(state);
-    return;
-  }
-
-  if (state.ApplyPropertyToRegularStyle())
-    state.Style()->SetColor(StyleBuilderConverter::ConvertColor(state, value));
-  if (state.ApplyPropertyToVisitedLinkStyle()) {
-    state.Style()->SetVisitedLinkColor(
-        StyleBuilderConverter::ConvertColor(state, value, true));
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_custom.cc
deleted file mode 100644
index 473436e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/color_interpolation.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColorInterpolation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.ColorInterpolation());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_filters_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_filters_custom.cc
deleted file mode 100644
index edbc601..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/color_interpolation_filters_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/color_interpolation_filters.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColorInterpolationFilters::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.ColorInterpolationFilters());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/color_rendering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/color_rendering_custom.cc
deleted file mode 100644
index 9c76a140..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/color_rendering_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/color_rendering.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColorRendering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.ColorRendering());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_count_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_count_custom.cc
deleted file mode 100644
index ae3332d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_count_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_count.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnCount::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeColumnCount(range);
-}
-
-const CSSValue* ColumnCount::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HasAutoColumnCount())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return CSSPrimitiveValue::Create(style.ColumnCount(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_fill_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_fill_custom.cc
deleted file mode 100644
index 01b60be1d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_fill_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_fill.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnFill::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetColumnFill());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_gap_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_gap_custom.cc
deleted file mode 100644
index e84fc9d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_gap_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnGap::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGapLength(range, context);
-}
-
-const CSSValue* ColumnGap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool) const {
-  return ComputedStyleUtils::ValueForGapLength(style.ColumnGap(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_rule_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_rule_color_custom.cc
deleted file mode 100644
index 95f128af..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_rule_color_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnRuleColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color ColumnRuleColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkColumnRuleColor()
-                                   : style.ColumnRuleColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* ColumnRuleColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.ColumnRuleColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_rule_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_rule_style_custom.cc
deleted file mode 100644
index bace7dd..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_rule_style_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnRuleStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.ColumnRuleStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_rule_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_rule_width_custom.cc
deleted file mode 100644
index 1dce9d4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_rule_width_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnRuleWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLineWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ColumnRuleWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.ColumnRuleWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_span_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_span_custom.cc
deleted file mode 100644
index a7370f09d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_span_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_span.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnSpan::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeIdent<CSSValueID::kAll,
-                                                   CSSValueID::kNone>(range);
-}
-
-const CSSValue* ColumnSpan::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(static_cast<unsigned>(style.GetColumnSpan())
-                                        ? CSSValueID::kAll
-                                        : CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/column_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/column_width_custom.cc
deleted file mode 100644
index 26a3b23..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/column_width_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/column_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ColumnWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeColumnWidth(range);
-}
-
-const CSSValue* ColumnWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HasAutoColumnWidth())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return ZoomAdjustedPixelValue(style.ColumnWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/contain_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/contain_custom.cc
deleted file mode 100644
index bb0c7a7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/contain_custom.cc
+++ /dev/null
@@ -1,86 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/contain.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-// none | strict | content | [ size || layout || style || paint ]
-const CSSValue* Contain::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (id == CSSValueID::kStrict || id == CSSValueID::kContent) {
-    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
-    return list;
-  }
-
-  CSSIdentifierValue* size = nullptr;
-  CSSIdentifierValue* layout = nullptr;
-  CSSIdentifierValue* style = nullptr;
-  CSSIdentifierValue* paint = nullptr;
-  while (true) {
-    id = range.Peek().Id();
-    if (id == CSSValueID::kSize && !size)
-      size = css_property_parser_helpers::ConsumeIdent(range);
-    else if (id == CSSValueID::kLayout && !layout)
-      layout = css_property_parser_helpers::ConsumeIdent(range);
-    else if (id == CSSValueID::kStyle && !style)
-      style = css_property_parser_helpers::ConsumeIdent(range);
-    else if (id == CSSValueID::kPaint && !paint)
-      paint = css_property_parser_helpers::ConsumeIdent(range);
-    else
-      break;
-  }
-  if (size)
-    list->Append(*size);
-  if (layout)
-    list->Append(*layout);
-  if (style)
-    list->Append(*style);
-  if (paint)
-    list->Append(*paint);
-  if (!list->length())
-    return nullptr;
-  return list;
-}
-
-const CSSValue* Contain::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.Contain())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  if (style.Contain() == kContainsStrict)
-    return CSSIdentifierValue::Create(CSSValueID::kStrict);
-  if (style.Contain() == kContainsContent)
-    return CSSIdentifierValue::Create(CSSValueID::kContent);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (style.ContainsSize())
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kSize));
-  if (style.Contain() & kContainsLayout)
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kLayout));
-  if (style.ContainsStyle())
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kStyle));
-  if (style.ContainsPaint())
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kPaint));
-  DCHECK(list->length());
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/content_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/content_custom.cc
deleted file mode 100644
index 04aa395..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/content_custom.cc
+++ /dev/null
@@ -1,220 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/content.h"
-
-#include "third_party/blink/renderer/core/css/css_counter_value.h"
-#include "third_party/blink/renderer/core/css/css_function_value.h"
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace {
-
-CSSValue* ConsumeAttr(CSSParserTokenRange args,
-                      const CSSParserContext& context) {
-  if (args.Peek().GetType() != kIdentToken)
-    return nullptr;
-
-  AtomicString attr_name =
-      args.ConsumeIncludingWhitespace().Value().ToAtomicString();
-  if (!args.AtEnd())
-    return nullptr;
-
-  if (context.IsHTMLDocument())
-    attr_name = attr_name.LowerASCII();
-
-  CSSFunctionValue* attr_value =
-      MakeGarbageCollected<CSSFunctionValue>(CSSValueID::kAttr);
-  attr_value->Append(*MakeGarbageCollected<CSSCustomIdentValue>(attr_name));
-  return attr_value;
-}
-
-CSSValue* ConsumeCounterContent(CSSParserTokenRange args,
-                                const CSSParserContext& context,
-                                bool counters) {
-  CSSCustomIdentValue* identifier =
-      css_property_parser_helpers::ConsumeCustomIdent(args, context);
-  if (!identifier)
-    return nullptr;
-
-  CSSStringValue* separator = nullptr;
-  if (!counters) {
-    separator = MakeGarbageCollected<CSSStringValue>(String());
-  } else {
-    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args) ||
-        args.Peek().GetType() != kStringToken)
-      return nullptr;
-    separator = MakeGarbageCollected<CSSStringValue>(
-        args.ConsumeIncludingWhitespace().Value().ToString());
-  }
-
-  CSSIdentifierValue* list_style = nullptr;
-  if (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)) {
-    CSSValueID id = args.Peek().Id();
-    if ((id != CSSValueID::kNone &&
-         (id < CSSValueID::kDisc || id > CSSValueID::kKatakanaIroha)))
-      return nullptr;
-    list_style = css_property_parser_helpers::ConsumeIdent(args);
-  } else {
-    list_style = CSSIdentifierValue::Create(CSSValueID::kDecimal);
-  }
-
-  if (!args.AtEnd())
-    return nullptr;
-  return MakeGarbageCollected<cssvalue::CSSCounterValue>(identifier, list_style,
-                                                         separator);
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* Content::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  if (css_property_parser_helpers::IdentMatches<CSSValueID::kNone,
-                                                CSSValueID::kNormal>(
-          range.Peek().Id()))
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValueList* values = CSSValueList::CreateSpaceSeparated();
-
-  do {
-    CSSValue* parsed_value =
-        css_property_parser_helpers::ConsumeImage(range, &context);
-    if (!parsed_value) {
-      parsed_value = css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kOpenQuote, CSSValueID::kCloseQuote,
-          CSSValueID::kNoOpenQuote, CSSValueID::kNoCloseQuote>(range);
-    }
-    if (!parsed_value)
-      parsed_value = css_property_parser_helpers::ConsumeString(range);
-    if (!parsed_value) {
-      if (range.Peek().FunctionId() == CSSValueID::kAttr) {
-        parsed_value = ConsumeAttr(
-            css_property_parser_helpers::ConsumeFunction(range), context);
-      } else if (range.Peek().FunctionId() == CSSValueID::kCounter) {
-        parsed_value = ConsumeCounterContent(
-            css_property_parser_helpers::ConsumeFunction(range), context,
-            false);
-      } else if (range.Peek().FunctionId() == CSSValueID::kCounters) {
-        parsed_value = ConsumeCounterContent(
-            css_property_parser_helpers::ConsumeFunction(range), context, true);
-      }
-      if (!parsed_value)
-        return nullptr;
-    }
-    values->Append(*parsed_value);
-  } while (!range.AtEnd());
-
-  return values;
-}
-
-const CSSValue* Content::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForContentData(style);
-}
-
-void Content::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetContent(nullptr);
-}
-
-void Content::ApplyInherit(StyleResolverState& state) const {
-  // FIXME: In CSS3, it will be possible to inherit content. In CSS2 it is not.
-  // This note is a reminder that eventually "inherit" needs to be supported.
-}
-
-void Content::ApplyValue(StyleResolverState& state,
-                         const CSSValue& value) const {
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    DCHECK(identifier_value->GetValueID() == CSSValueID::kNormal ||
-           identifier_value->GetValueID() == CSSValueID::kNone);
-    state.Style()->SetContent(nullptr);
-    return;
-  }
-
-  ContentData* first_content = nullptr;
-  ContentData* prev_content = nullptr;
-  for (auto& item : To<CSSValueList>(value)) {
-    ContentData* next_content = nullptr;
-    if (item->IsImageGeneratorValue() || item->IsImageSetValue() ||
-        item->IsImageValue()) {
-      next_content = ContentData::Create(
-          state.GetStyleImage(CSSPropertyID::kContent, *item));
-    } else if (const auto* counter_value =
-                   DynamicTo<cssvalue::CSSCounterValue>(item.Get())) {
-      const auto list_style_type =
-          CssValueIDToPlatformEnum<EListStyleType>(counter_value->ListStyle());
-      std::unique_ptr<CounterContent> counter =
-          std::make_unique<CounterContent>(
-              AtomicString(counter_value->Identifier()), list_style_type,
-              AtomicString(counter_value->Separator()));
-      next_content = ContentData::Create(std::move(counter));
-    } else if (auto* item_identifier_value =
-                   DynamicTo<CSSIdentifierValue>(item.Get())) {
-      QuoteType quote_type;
-      switch (item_identifier_value->GetValueID()) {
-        default:
-          NOTREACHED();
-          FALLTHROUGH;
-        case CSSValueID::kOpenQuote:
-          quote_type = QuoteType::kOpen;
-          break;
-        case CSSValueID::kCloseQuote:
-          quote_type = QuoteType::kClose;
-          break;
-        case CSSValueID::kNoOpenQuote:
-          quote_type = QuoteType::kNoOpen;
-          break;
-        case CSSValueID::kNoCloseQuote:
-          quote_type = QuoteType::kNoClose;
-          break;
-      }
-      next_content = ContentData::Create(quote_type);
-    } else {
-      String string;
-      if (const auto* function_value =
-              DynamicTo<CSSFunctionValue>(item.Get())) {
-        DCHECK_EQ(function_value->FunctionType(), CSSValueID::kAttr);
-        state.Style()->SetHasAttrContent();
-        // TODO: Can a namespace be specified for an attr(foo)?
-        QualifiedName attr(
-            g_null_atom,
-            To<CSSCustomIdentValue>(function_value->Item(0)).Value(),
-            g_null_atom);
-        const AtomicString& attr_value = state.GetElement()->getAttribute(attr);
-        string = attr_value.IsNull() ? g_empty_string : attr_value.GetString();
-      } else {
-        string = To<CSSStringValue>(*item).Value();
-      }
-      if (prev_content && prev_content->IsText()) {
-        TextContentData* text_content = To<TextContentData>(prev_content);
-        text_content->SetText(text_content->GetText() + string);
-        continue;
-      }
-      next_content = ContentData::Create(string);
-    }
-
-    if (!first_content)
-      first_content = next_content;
-    else
-      prev_content->SetNext(next_content);
-
-    prev_content = next_content;
-  }
-  DCHECK(first_content);
-  state.Style()->SetContent(first_content);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/counter_increment_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/counter_increment_custom.cc
deleted file mode 100644
index d93128e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/counter_increment_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/counter_increment.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const int kCounterIncrementDefaultValue = 1;
-
-const CSSValue* CounterIncrement::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeCounter(range, context,
-                                           kCounterIncrementDefaultValue);
-}
-
-const CSSValue* CounterIncrement::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForCounterDirectives(style, true);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/counter_reset_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/counter_reset_custom.cc
deleted file mode 100644
index 04a48a0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/counter_reset_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/counter_reset.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const int kCounterResetDefaultValue = 0;
-
-const CSSValue* CounterReset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeCounter(range, context,
-                                           kCounterResetDefaultValue);
-}
-
-const CSSValue* CounterReset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForCounterDirectives(style, false);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/cursor_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/cursor_custom.cc
deleted file mode 100644
index 8a387a4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/cursor_custom.cc
+++ /dev/null
@@ -1,137 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/cursor.h"
-
-#include "third_party/blink/renderer/core/css/css_cursor_image_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_mode.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/frame/use_counter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Cursor::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  bool in_quirks_mode = IsQuirksModeBehavior(context.Mode());
-  CSSValueList* list = nullptr;
-  while (
-      CSSValue* image = css_property_parser_helpers::ConsumeImage(
-          range, &context,
-          css_property_parser_helpers::ConsumeGeneratedImagePolicy::kForbid)) {
-    double num;
-    IntPoint hot_spot(-1, -1);
-    bool hot_spot_specified = false;
-    if (css_property_parser_helpers::ConsumeNumberRaw(range, num)) {
-      hot_spot.SetX(clampTo<int>(num));
-      if (!css_property_parser_helpers::ConsumeNumberRaw(range, num))
-        return nullptr;
-      hot_spot.SetY(clampTo<int>(num));
-      hot_spot_specified = true;
-    }
-
-    if (!list)
-      list = CSSValueList::CreateCommaSeparated();
-
-    list->Append(*MakeGarbageCollected<cssvalue::CSSCursorImageValue>(
-        *image, hot_spot_specified, hot_spot));
-    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range))
-      return nullptr;
-  }
-
-  CSSValueID id = range.Peek().Id();
-  if (!range.AtEnd()) {
-    if (id == CSSValueID::kWebkitZoomIn)
-      context.Count(WebFeature::kPrefixedCursorZoomIn);
-    else if (id == CSSValueID::kWebkitZoomOut)
-      context.Count(WebFeature::kPrefixedCursorZoomOut);
-    else if (id == CSSValueID::kWebkitGrab)
-      context.Count(WebFeature::kPrefixedCursorGrab);
-    else if (id == CSSValueID::kWebkitGrabbing)
-      context.Count(WebFeature::kPrefixedCursorGrabbing);
-  }
-  CSSValue* cursor_type = nullptr;
-  if (id == CSSValueID::kHand) {
-    if (!in_quirks_mode)  // Non-standard behavior
-      return nullptr;
-    cursor_type = CSSIdentifierValue::Create(CSSValueID::kPointer);
-    range.ConsumeIncludingWhitespace();
-  } else if ((id >= CSSValueID::kAuto && id <= CSSValueID::kWebkitZoomOut) ||
-             id == CSSValueID::kCopy || id == CSSValueID::kNone) {
-    cursor_type = css_property_parser_helpers::ConsumeIdent(range);
-  } else {
-    return nullptr;
-  }
-
-  if (!list)
-    return cursor_type;
-  list->Append(*cursor_type);
-  return list;
-}
-
-const CSSValue* Cursor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = nullptr;
-  CursorList* cursors = style.Cursors();
-  if (cursors && cursors->size() > 0) {
-    list = CSSValueList::CreateCommaSeparated();
-    for (const CursorData& cursor : *cursors) {
-      if (StyleImage* image = cursor.GetImage()) {
-        list->Append(*MakeGarbageCollected<cssvalue::CSSCursorImageValue>(
-            *image->ComputedCSSValue(), cursor.HotSpotSpecified(),
-            cursor.HotSpot()));
-      }
-    }
-  }
-  CSSValue* value = CSSIdentifierValue::Create(style.Cursor());
-  if (list) {
-    list->Append(*value);
-    return list;
-  }
-  return value;
-}
-
-void Cursor::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->ClearCursorList();
-  state.Style()->SetCursor(ComputedStyleInitialValues::InitialCursor());
-}
-
-void Cursor::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetCursor(state.ParentStyle()->Cursor());
-  state.Style()->SetCursorList(state.ParentStyle()->Cursors());
-}
-
-void Cursor::ApplyValue(StyleResolverState& state,
-                        const CSSValue& value) const {
-  state.Style()->ClearCursorList();
-  if (auto* value_list = DynamicTo<CSSValueList>(value)) {
-    state.Style()->SetCursor(ECursor::kAuto);
-    for (const auto& item : *value_list) {
-      if (const auto* cursor =
-              DynamicTo<cssvalue::CSSCursorImageValue>(*item)) {
-        const CSSValue& image = cursor->ImageValue();
-        state.Style()->AddCursor(
-            state.GetStyleImage(CSSPropertyID::kCursor, image),
-            cursor->HotSpotSpecified(), cursor->HotSpot());
-      } else {
-        state.Style()->SetCursor(
-            To<CSSIdentifierValue>(*item).ConvertTo<ECursor>());
-      }
-    }
-  } else {
-    state.Style()->SetCursor(
-        To<CSSIdentifierValue>(value).ConvertTo<ECursor>());
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/cx_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/cx_custom.cc
deleted file mode 100644
index 517c04c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/cx_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/cx.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Cx::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeAll);
-}
-
-const CSSValue* Cx::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Cx(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/cy_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/cy_custom.cc
deleted file mode 100644
index 97b5a99f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/cy_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/cy.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Cy::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeAll);
-}
-
-const CSSValue* Cy::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Cy(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/d_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/d_custom.cc
deleted file mode 100644
index aaade2d2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/d_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/d.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* D::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext&,
-                                    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumePathOrNone(range);
-}
-
-const CSSValue* D::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (const StylePath* style_path = svg_style.D())
-    return style_path->ComputedCSSValue();
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/direction_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/direction_custom.cc
deleted file mode 100644
index 586cf51..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/direction_custom.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/direction.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Direction::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Direction());
-}
-
-void Direction::ApplyValue(StyleResolverState& state,
-                           const CSSValue& value) const {
-  state.Style()->SetDirection(
-      To<CSSIdentifierValue>(value).ConvertTo<TextDirection>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/display_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/display_custom.cc
deleted file mode 100644
index df436ac..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/display_custom.cc
+++ /dev/null
@@ -1,95 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/display.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_layout_function_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Display::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  // NOTE: All the keyword values for the display property are handled by the
-  // CSSParserFastPaths.
-  if (!RuntimeEnabledFeatures::CSSLayoutAPIEnabled())
-    return nullptr;
-
-  if (!context.IsSecureContext())
-    return nullptr;
-
-  CSSValueID function = range.Peek().FunctionId();
-  if (function != CSSValueID::kLayout && function != CSSValueID::kInlineLayout)
-    return nullptr;
-
-  CSSParserTokenRange range_copy = range;
-  CSSParserTokenRange args =
-      css_property_parser_helpers::ConsumeFunction(range_copy);
-  CSSCustomIdentValue* name =
-      css_property_parser_helpers::ConsumeCustomIdent(args, context);
-
-  // If we didn't get a custom-ident or didn't exhaust the function arguments
-  // return nothing.
-  if (!name || !args.AtEnd())
-    return nullptr;
-
-  range = range_copy;
-  return MakeGarbageCollected<cssvalue::CSSLayoutFunctionValue>(
-      name, /* is_inline */ function == CSSValueID::kInlineLayout);
-}
-
-const CSSValue* Display::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  if (style.IsDisplayLayoutCustomBox()) {
-    return MakeGarbageCollected<cssvalue::CSSLayoutFunctionValue>(
-        MakeGarbageCollected<CSSCustomIdentValue>(
-            style.DisplayLayoutCustomName()),
-        style.IsDisplayInlineType());
-  }
-
-  return CSSIdentifierValue::Create(style.Display());
-}
-
-void Display::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetDisplay(ComputedStyleInitialValues::InitialDisplay());
-  state.Style()->SetDisplayLayoutCustomName(
-      ComputedStyleInitialValues::InitialDisplayLayoutCustomName());
-}
-
-void Display::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetDisplay(state.ParentStyle()->Display());
-  state.Style()->SetDisplayLayoutCustomName(
-      state.ParentStyle()->DisplayLayoutCustomName());
-}
-
-void Display::ApplyValue(StyleResolverState& state,
-                         const CSSValue& value) const {
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    state.Style()->SetDisplay(identifier_value->ConvertTo<EDisplay>());
-    state.Style()->SetDisplayLayoutCustomName(
-        ComputedStyleInitialValues::InitialDisplayLayoutCustomName());
-    return;
-  }
-
-  const auto& layout_function_value =
-      To<cssvalue::CSSLayoutFunctionValue>(value);
-
-  EDisplay display = layout_function_value.IsInline()
-                         ? EDisplay::kInlineLayoutCustom
-                         : EDisplay::kLayoutCustom;
-  state.Style()->SetDisplay(display);
-  state.Style()->SetDisplayLayoutCustomName(layout_function_value.GetName());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/dominant_baseline_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/dominant_baseline_custom.cc
deleted file mode 100644
index cb4b455..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/dominant_baseline_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/dominant_baseline.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* DominantBaseline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.DominantBaseline());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/empty_cells_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/empty_cells_custom.cc
deleted file mode 100644
index cefac2d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/empty_cells_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/empty_cells.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* EmptyCells::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.EmptyCells());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/fill_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/fill_custom.cc
deleted file mode 100644
index f266db3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/fill_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/fill.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Fill::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParsePaintStroke(range, context);
-}
-
-const CSSValue* Fill::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::AdjustSVGPaintForCurrentColor(
-      svg_style.FillPaint(), style.GetColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/fill_opacity_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/fill_opacity_custom.cc
deleted file mode 100644
index 4ff579ef..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/fill_opacity_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/fill_opacity.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* FillOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* FillOpacity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(svg_style.FillOpacity(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/fill_rule_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/fill_rule_custom.cc
deleted file mode 100644
index 90e993e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/fill_rule_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/fill_rule.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FillRule::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.FillRule());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/filter_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/filter_custom.cc
deleted file mode 100644
index 74313572..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/filter_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/filter.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Filter::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeFilterFunctionList(range, context);
-}
-
-const CSSValue* Filter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFilter(style, style.Filter());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flex_basis_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flex_basis_custom.cc
deleted file mode 100644
index 4b6f569..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flex_basis_custom.cc
+++ /dev/null
@@ -1,36 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flex_basis.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FlexBasis::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // FIXME: Support intrinsic dimensions too.
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative);
-}
-
-const CSSValue* FlexBasis::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.FlexBasis(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flex_direction_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flex_direction_custom.cc
deleted file mode 100644
index 50bd003..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flex_direction_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flex_direction.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FlexDirection::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.FlexDirection());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flex_grow_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flex_grow_custom.cc
deleted file mode 100644
index 7636c88..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flex_grow_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flex_grow.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FlexGrow::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext&,
-                                           const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range,
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* FlexGrow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.FlexGrow(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flex_shrink_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flex_shrink_custom.cc
deleted file mode 100644
index 6268696..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flex_shrink_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flex_shrink.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FlexShrink::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range,
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* FlexShrink::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.FlexShrink(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flex_wrap_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flex_wrap_custom.cc
deleted file mode 100644
index 4ecb245..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flex_wrap_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flex_wrap.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FlexWrap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.FlexWrap());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc
deleted file mode 100644
index 86658d8..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/float_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/float.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Float::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.Display() != EDisplay::kNone && style.HasOutOfFlowPosition())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return CSSIdentifierValue::Create(style.Floating());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flood_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flood_color_custom.cc
deleted file mode 100644
index 6885c49..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flood_color_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flood_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FloodColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color FloodColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = style.FloodColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* FloodColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(style,
-                                                      style.FloodColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/flood_opacity_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/flood_opacity_custom.cc
deleted file mode 100644
index 768b47f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/flood_opacity_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/flood_opacity.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FloodOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* FloodOpacity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(svg_style.FloodOpacity(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_family_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_family_custom.cc
deleted file mode 100644
index e417f75..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_family_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_family.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontFamily::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontFamily(range);
-}
-
-const CSSValue* FontFamily::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontFamily(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_feature_settings_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_feature_settings_custom.cc
deleted file mode 100644
index 76b23183..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_feature_settings_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_feature_settings.h"
-
-#include "third_party/blink/renderer/core/css/css_font_feature_value.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontFeatureSettings::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontFeatureSettings(range);
-}
-
-const CSSValue* FontFeatureSettings::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const blink::FontFeatureSettings* feature_settings =
-      style.GetFontDescription().FeatureSettings();
-  if (!feature_settings || !feature_settings->size())
-    return CSSIdentifierValue::Create(CSSValueID::kNormal);
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (wtf_size_t i = 0; i < feature_settings->size(); ++i) {
-    const FontFeature& feature = feature_settings->at(i);
-    auto* feature_value = MakeGarbageCollected<cssvalue::CSSFontFeatureValue>(
-        feature.Tag(), feature.Value());
-    list->Append(*feature_value);
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_kerning_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_kerning_custom.cc
deleted file mode 100644
index 3d7d64c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_kerning_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_kerning.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontKerning::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetFontDescription().GetKerning());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_size_adjust_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_size_adjust_custom.cc
deleted file mode 100644
index 0c0750c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_size_adjust_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_size_adjust.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontSizeAdjust::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  DCHECK(RuntimeEnabledFeatures::CSSFontSizeAdjustEnabled());
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeNumber(range,
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* FontSizeAdjust::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HasFontSizeAdjust()) {
-    return CSSPrimitiveValue::Create(style.FontSizeAdjust(),
-                                     CSSPrimitiveValue::UnitType::kNumber);
-  }
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_size_custom.cc
deleted file mode 100644
index c7949a25..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_size_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontSize::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
-                                           const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontSize(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-const CSSValue* FontSize::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontSize(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_stretch_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_stretch_custom.cc
deleted file mode 100644
index e84ab2b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_stretch_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_stretch.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontStretch::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontStretch(range, context.Mode());
-}
-
-const CSSValue* FontStretch::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontStretch(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_style_custom.cc
deleted file mode 100644
index 0fece06..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_style_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_style.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontStyle::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontStyle(range, context.Mode());
-}
-
-const CSSValue* FontStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontStyle(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_variant_caps_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_variant_caps_custom.cc
deleted file mode 100644
index 8e2468d0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_variant_caps_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_caps.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontVariantCaps::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kNormal, CSSValueID::kSmallCaps, CSSValueID::kAllSmallCaps,
-      CSSValueID::kPetiteCaps, CSSValueID::kAllPetiteCaps, CSSValueID::kUnicase,
-      CSSValueID::kTitlingCaps>(range);
-}
-
-const CSSValue* FontVariantCaps::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontVariantCaps(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_variant_east_asian_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_variant_east_asian_custom.cc
deleted file mode 100644
index ebabe47a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_variant_east_asian_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_east_asian.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_east_asian_parser.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontVariantEastAsian::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNormal)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  FontVariantEastAsianParser east_asian_parser;
-  do {
-    if (east_asian_parser.ConsumeEastAsian(range) !=
-        FontVariantEastAsianParser::ParseResult::kConsumedValue)
-      return nullptr;
-  } while (!range.AtEnd());
-
-  return east_asian_parser.FinalizeValue();
-}
-
-const CSSValue* FontVariantEastAsian::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontVariantEastAsian(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_variant_ligatures_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_variant_ligatures_custom.cc
deleted file mode 100644
index a8fea93a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_variant_ligatures_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_ligatures.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_ligatures_parser.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontVariantLigatures::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNormal ||
-      range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  FontVariantLigaturesParser ligatures_parser;
-  do {
-    if (ligatures_parser.ConsumeLigature(range) !=
-        FontVariantLigaturesParser::ParseResult::kConsumedValue)
-      return nullptr;
-  } while (!range.AtEnd());
-
-  return ligatures_parser.FinalizeValue();
-}
-
-const CSSValue* FontVariantLigatures::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontVariantLigatures(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_variant_numeric_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_variant_numeric_custom.cc
deleted file mode 100644
index c76a1d3b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_variant_numeric_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_numeric.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_numeric_parser.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontVariantNumeric::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNormal)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  FontVariantNumericParser numeric_parser;
-  do {
-    if (numeric_parser.ConsumeNumeric(range) !=
-        FontVariantNumericParser::ParseResult::kConsumedValue)
-      return nullptr;
-  } while (!range.AtEnd());
-
-  return numeric_parser.FinalizeValue();
-}
-
-const CSSValue* FontVariantNumeric::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontVariantNumeric(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_variation_settings_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_variation_settings_custom.cc
deleted file mode 100644
index 887ccb7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_variation_settings_custom.cc
+++ /dev/null
@@ -1,86 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_variation_settings.h"
-
-#include "third_party/blink/renderer/core/css/css_font_variation_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace {
-
-cssvalue::CSSFontVariationValue* ConsumeFontVariationTag(
-    CSSParserTokenRange& range) {
-  // Feature tag name consists of 4-letter characters.
-  static const wtf_size_t kTagNameLength = 4;
-
-  const CSSParserToken& token = range.ConsumeIncludingWhitespace();
-  // Feature tag name comes first
-  if (token.GetType() != kStringToken)
-    return nullptr;
-  if (token.Value().length() != kTagNameLength)
-    return nullptr;
-  AtomicString tag = token.Value().ToAtomicString();
-  for (wtf_size_t i = 0; i < kTagNameLength; ++i) {
-    // Limits the range of characters to 0x20-0x7E, following the tag name rules
-    // defined in the OpenType specification.
-    UChar character = tag[i];
-    if (character < 0x20 || character > 0x7E)
-      return nullptr;
-  }
-
-  double tag_value = 0;
-  if (!css_property_parser_helpers::ConsumeNumberRaw(range, tag_value))
-    return nullptr;
-  return MakeGarbageCollected<cssvalue::CSSFontVariationValue>(
-      tag, clampTo<float>(tag_value));
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* FontVariationSettings::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNormal)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  CSSValueList* variation_settings = CSSValueList::CreateCommaSeparated();
-  do {
-    cssvalue::CSSFontVariationValue* font_variation_value =
-        ConsumeFontVariationTag(range);
-    if (!font_variation_value)
-      return nullptr;
-    variation_settings->Append(*font_variation_value);
-  } while (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range));
-  return variation_settings;
-}
-
-const CSSValue* FontVariationSettings::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const blink::FontVariationSettings* variation_settings =
-      style.GetFontDescription().VariationSettings();
-  if (!variation_settings || !variation_settings->size())
-    return CSSIdentifierValue::Create(CSSValueID::kNormal);
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (wtf_size_t i = 0; i < variation_settings->size(); ++i) {
-    const FontVariationAxis& variation_axis = variation_settings->at(i);
-    cssvalue::CSSFontVariationValue* variation_value =
-        MakeGarbageCollected<cssvalue::CSSFontVariationValue>(
-            variation_axis.Tag(), variation_axis.Value());
-    list->Append(*variation_value);
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/font_weight_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/font_weight_custom.cc
deleted file mode 100644
index 45f37e6d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/font_weight_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/font_weight.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* FontWeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeFontWeight(range, context.Mode());
-}
-
-const CSSValue* FontWeight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFontWeight(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_columns_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_auto_columns_custom.cc
deleted file mode 100644
index b1cf05a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_columns_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_columns.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridAutoColumns::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridTrackList(
-      range, context, context.Mode(),
-      css_parsing_utils::TrackListType::kGridAuto);
-}
-
-// Specs mention that getComputedStyle() should return the used value of the
-// property instead of the computed one for grid-template-{rows|columns} but
-// not for the grid-auto-{rows|columns} as things like grid-auto-columns:
-// 2fr; cannot be resolved to a value in pixels as the '2fr' means very
-// different things depending on the size of the explicit grid or the number
-// of implicit tracks added to the grid. See
-// http://lists.w3.org/Archives/Public/www-style/2013Nov/0014.html
-const CSSValue* GridAutoColumns::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridTrackSizeList(kForColumns, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_flow_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_auto_flow_custom.cc
deleted file mode 100644
index 11a12e97..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_flow_custom.cc
+++ /dev/null
@@ -1,73 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_flow.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridAutoFlow::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSIdentifierValue* row_or_column_value =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kRow,
-                                                CSSValueID::kColumn>(range);
-  CSSIdentifierValue* dense_algorithm =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
-  if (!row_or_column_value) {
-    row_or_column_value =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kRow,
-                                                  CSSValueID::kColumn>(range);
-    if (!row_or_column_value && !dense_algorithm)
-      return nullptr;
-  }
-  CSSValueList* parsed_values = CSSValueList::CreateSpaceSeparated();
-  if (row_or_column_value)
-    parsed_values->Append(*row_or_column_value);
-  if (dense_algorithm)
-    parsed_values->Append(*dense_algorithm);
-  return parsed_values;
-}
-
-const CSSValue* GridAutoFlow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  switch (style.GetGridAutoFlow()) {
-    case kAutoFlowRow:
-    case kAutoFlowRowDense:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRow));
-      break;
-    case kAutoFlowColumn:
-    case kAutoFlowColumnDense:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kColumn));
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  switch (style.GetGridAutoFlow()) {
-    case kAutoFlowRowDense:
-    case kAutoFlowColumnDense:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kDense));
-      break;
-    default:
-      // Do nothing.
-      break;
-  }
-
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_rows_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_auto_rows_custom.cc
deleted file mode 100644
index cb690bf..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_auto_rows_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_rows.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridAutoRows::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridTrackList(
-      range, context, context.Mode(),
-      css_parsing_utils::TrackListType::kGridAuto);
-}
-
-const CSSValue* GridAutoRows::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridTrackSizeList(kForRows, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_column_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_column_end_custom.cc
deleted file mode 100644
index 7ac7e97..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_column_end_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_column_end.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridColumnEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridLine(range, context);
-}
-
-const CSSValue* GridColumnEnd::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridPosition(style.GridColumnEnd());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_column_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_column_start_custom.cc
deleted file mode 100644
index d1a3682..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_column_start_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_column_start.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridColumnStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridLine(range, context);
-}
-
-const CSSValue* GridColumnStart::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridPosition(style.GridColumnStart());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_row_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_row_end_custom.cc
deleted file mode 100644
index df82567..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_row_end_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_row_end.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridRowEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridLine(range, context);
-}
-
-const CSSValue* GridRowEnd::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridPosition(style.GridRowEnd());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_row_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_row_start_custom.cc
deleted file mode 100644
index c7263362a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_row_start_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_row_start.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridRowStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridLine(range, context);
-}
-
-const CSSValue* GridRowStart::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridPosition(style.GridRowStart());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc
deleted file mode 100644
index 66069e7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_template_areas_custom.cc
+++ /dev/null
@@ -1,113 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_areas.h"
-
-#include "third_party/blink/renderer/core/css/css_grid_template_areas_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style/grid_area.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridTemplateAreas::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  NamedGridAreaMap grid_area_map;
-  size_t row_count = 0;
-  size_t column_count = 0;
-
-  while (range.Peek().GetType() == kStringToken) {
-    if (!css_parsing_utils::ParseGridTemplateAreasRow(
-            range.ConsumeIncludingWhitespace().Value().ToString(),
-            grid_area_map, row_count, column_count))
-      return nullptr;
-    ++row_count;
-  }
-
-  if (row_count == 0)
-    return nullptr;
-  DCHECK(column_count);
-  return MakeGarbageCollected<cssvalue::CSSGridTemplateAreasValue>(
-      grid_area_map, row_count, column_count);
-}
-
-const CSSValue* GridTemplateAreas::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.NamedGridAreaRowCount()) {
-    DCHECK(!style.NamedGridAreaColumnCount());
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  }
-
-  return MakeGarbageCollected<cssvalue::CSSGridTemplateAreasValue>(
-      style.NamedGridArea(), style.NamedGridAreaRowCount(),
-      style.NamedGridAreaColumnCount());
-}
-
-void GridTemplateAreas::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetNamedGridArea(
-      ComputedStyleInitialValues::InitialNamedGridArea());
-  state.Style()->SetNamedGridAreaRowCount(
-      ComputedStyleInitialValues::InitialNamedGridAreaRowCount());
-  state.Style()->SetNamedGridAreaColumnCount(
-      ComputedStyleInitialValues::InitialNamedGridAreaColumnCount());
-}
-
-void GridTemplateAreas::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetNamedGridArea(state.ParentStyle()->NamedGridArea());
-  state.Style()->SetNamedGridAreaRowCount(
-      state.ParentStyle()->NamedGridAreaRowCount());
-  state.Style()->SetNamedGridAreaColumnCount(
-      state.ParentStyle()->NamedGridAreaColumnCount());
-}
-
-void GridTemplateAreas::ApplyValue(StyleResolverState& state,
-                                   const CSSValue& value) const {
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    // FIXME: Shouldn't we clear the grid-area values
-    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kNone);
-    return;
-  }
-
-  const auto& grid_template_areas_value =
-      To<cssvalue::CSSGridTemplateAreasValue>(value);
-  const NamedGridAreaMap& new_named_grid_areas =
-      grid_template_areas_value.GridAreaMap();
-
-  NamedGridLinesMap named_grid_column_lines;
-  NamedGridLinesMap named_grid_row_lines;
-  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-      state.Style()->OrderedNamedGridColumnLines(), named_grid_column_lines);
-  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
-      state.Style()->OrderedNamedGridRowLines(), named_grid_row_lines);
-  StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
-      new_named_grid_areas, named_grid_column_lines, kForColumns);
-  StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
-      new_named_grid_areas, named_grid_row_lines, kForRows);
-  state.Style()->SetNamedGridColumnLines(named_grid_column_lines);
-  state.Style()->SetNamedGridRowLines(named_grid_row_lines);
-
-  state.Style()->SetNamedGridArea(new_named_grid_areas);
-  state.Style()->SetNamedGridAreaRowCount(grid_template_areas_value.RowCount());
-  state.Style()->SetNamedGridAreaColumnCount(
-      grid_template_areas_value.ColumnCount());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_template_columns_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_template_columns_custom.cc
deleted file mode 100644
index 629599b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_template_columns_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_columns.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridTemplateColumns::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range, context,
-                                                              context.Mode());
-}
-
-bool GridTemplateColumns::IsLayoutDependent(const ComputedStyle* style,
-                                            LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsLayoutGrid();
-}
-
-const CSSValue* GridTemplateColumns::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridTrackList(kForColumns, layout_object,
-                                                   style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/grid_template_rows_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/grid_template_rows_custom.cc
deleted file mode 100644
index 5fff8e5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/grid_template_rows_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_rows.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* GridTemplateRows::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range, context,
-                                                              context.Mode());
-}
-
-bool GridTemplateRows::IsLayoutDependent(const ComputedStyle* style,
-                                         LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsLayoutGrid();
-}
-
-const CSSValue* GridTemplateRows::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForGridTrackList(kForRows, layout_object,
-                                                   style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/height_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/height_custom.cc
deleted file mode 100644
index 09104b72..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/height_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/height.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Height::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool Height::IsLayoutDependent(const ComputedStyle* style,
-                               LayoutObject* layout_object) const {
-  return layout_object && (layout_object->IsBox() || layout_object->IsSVG());
-}
-
-const CSSValue* Height::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (ComputedStyleUtils::WidthOrHeightShouldReturnUsedValue(layout_object)) {
-    return ZoomAdjustedPixelValue(
-        ComputedStyleUtils::UsedBoxSize(*layout_object).Height(), style);
-  }
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.Height(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/hyphens_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/hyphens_custom.cc
deleted file mode 100644
index 126d040..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/hyphens_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/hyphens.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Hyphens::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetHyphens());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/image_orientation_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/image_orientation_custom.cc
deleted file mode 100644
index 41f52e0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/image_orientation_custom.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/image_orientation.h"
-
-#include "third_party/blink/renderer/core/css/css_primitive_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ImageOrientation::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  DCHECK(RuntimeEnabledFeatures::ImageOrientationEnabled());
-  if (range.Peek().Id() == CSSValueID::kFromImage)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  if (range.Peek().GetType() != kNumberToken) {
-    CSSPrimitiveValue* angle = css_property_parser_helpers::ConsumeAngle(
-        range, &context, base::Optional<WebFeature>());
-    if (angle && angle->GetDoubleValue() == 0)
-      return angle;
-  }
-  return nullptr;
-}
-
-const CSSValue* ImageOrientation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.RespectImageOrientation() == kRespectImageOrientation)
-    return CSSIdentifierValue::Create(CSSValueID::kFromImage);
-  return CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kDegrees);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/image_rendering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/image_rendering_custom.cc
deleted file mode 100644
index 75bd3729..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/image_rendering_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/image_rendering.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ImageRendering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.ImageRendering());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/inline_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/inline_size_custom.cc
deleted file mode 100644
index 0352962..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/inline_size_custom.cc
+++ /dev/null
@@ -1,27 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/inline_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* InlineSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
-}
-
-bool InlineSize::IsLayoutDependent(const ComputedStyle* style,
-                                   LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/inset_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/inset_block_end_custom.cc
deleted file mode 100644
index fa897cf..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/inset_block_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/inset_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* InsetBlockEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/inset_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/inset_block_start_custom.cc
deleted file mode 100644
index 0e86d55..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/inset_block_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/inset_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* InsetBlockStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/inset_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/inset_inline_end_custom.cc
deleted file mode 100644
index fb265c3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/inset_inline_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/inset_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* InsetInlineEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/inset_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/inset_inline_start_custom.cc
deleted file mode 100644
index dd4b9b0b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/inset_inline_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/inset_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* InsetInlineStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/isolation_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/isolation_custom.cc
deleted file mode 100644
index 4e27da4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/isolation_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/isolation.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Isolation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Isolation());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/justify_content_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/justify_content_custom.cc
deleted file mode 100644
index ab88b668..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/justify_content_custom.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/justify_content.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* JustifyContent::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // justify-content property does not allow the <baseline-position> values.
-  if (css_property_parser_helpers::IdentMatches<
-          CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(
-          range.Peek().Id()))
-    return nullptr;
-  return css_parsing_utils::ConsumeContentDistributionOverflowPosition(
-      range, css_parsing_utils::IsContentPositionOrLeftOrRightKeyword);
-}
-
-const CSSValue* JustifyContent::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::
-      ValueForContentPositionAndDistributionWithOverflowAlignment(
-          style.JustifyContent());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/justify_items_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/justify_items_custom.cc
deleted file mode 100644
index f7032e3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/justify_items_custom.cc
+++ /dev/null
@@ -1,64 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/justify_items.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* JustifyItems::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSParserTokenRange range_copy = range;
-  // justify-items property does not allow the 'auto' value.
-  if (css_property_parser_helpers::IdentMatches<CSSValueID::kAuto>(
-          range.Peek().Id()))
-    return nullptr;
-  CSSIdentifierValue* legacy =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kLegacy>(
-          range_copy);
-  CSSIdentifierValue* position_keyword =
-      css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kCenter, CSSValueID::kLeft, CSSValueID::kRight>(
-          range_copy);
-  if (!legacy) {
-    legacy = css_property_parser_helpers::ConsumeIdent<CSSValueID::kLegacy>(
-        range_copy);
-  }
-  if (legacy) {
-    range = range_copy;
-    if (position_keyword) {
-      context.Count(WebFeature::kCSSLegacyAlignment);
-      return MakeGarbageCollected<CSSValuePair>(
-          legacy, position_keyword, CSSValuePair::kDropIdenticalValues);
-    }
-    return legacy;
-  }
-
-  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
-      range, css_parsing_utils::IsSelfPositionOrLeftOrRightKeyword);
-}
-
-const CSSValue* JustifyItems::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
-      style.JustifyItems().GetPosition() == ItemPosition::kAuto
-          ? ComputedStyleInitialValues::InitialDefaultAlignment()
-          : style.JustifyItems());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/justify_self_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/justify_self_custom.cc
deleted file mode 100644
index 68e1386..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/justify_self_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/justify_self.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* JustifySelf::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
-      range, css_parsing_utils::IsSelfPositionOrLeftOrRightKeyword);
-}
-
-const CSSValue* JustifySelf::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
-      style.JustifySelf());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/left_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/left_custom.cc
deleted file mode 100644
index d986478c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/left_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* Left::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_parsing_utils::UnitlessUnlessShorthand(local_context));
-}
-
-bool Left::IsLayoutDependent(const ComputedStyle* style,
-                             LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* Left::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
-                                                    layout_object);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/letter_spacing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/letter_spacing_custom.cc
deleted file mode 100644
index 674547a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/letter_spacing_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/letter_spacing.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* LetterSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseSpacing(range, context);
-}
-
-const CSSValue* LetterSpacing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.LetterSpacing())
-    return CSSIdentifierValue::Create(CSSValueID::kNormal);
-  return ZoomAdjustedPixelValue(style.LetterSpacing(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/lighting_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/lighting_color_custom.cc
deleted file mode 100644
index 761f4f8b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/lighting_color_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/lighting_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* LightingColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color LightingColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = style.LightingColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* LightingColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(style,
-                                                      style.LightingColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/line_break_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/line_break_custom.cc
deleted file mode 100644
index c980562..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/line_break_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/line_break.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* LineBreak::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetLineBreak());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/line_height_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/line_height_custom.cc
deleted file mode 100644
index 585a3f2b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/line_height_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/line_height.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* LineHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeLineHeight(range, context.Mode());
-}
-
-const CSSValue* LineHeight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForLineHeight(style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/line_height_step_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/line_height_step_custom.cc
deleted file mode 100644
index 68f5ca4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/line_height_step_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/line_height_step.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* LineHeightStep::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* LineHeightStep::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.LineHeightStep(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/list_style_image_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/list_style_image_custom.cc
deleted file mode 100644
index 43902d0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/list_style_image_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/list_style_image.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* ListStyleImage::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
-}
-
-const CSSValue* ListStyleImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.ListStyleImage())
-    return style.ListStyleImage()->ComputedCSSValue();
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-void ListStyleImage::ApplyValue(StyleResolverState& state,
-                                const CSSValue& value) const {
-  state.Style()->SetListStyleImage(
-      state.GetStyleImage(CSSPropertyID::kListStyleImage, value));
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/list_style_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/list_style_position_custom.cc
deleted file mode 100644
index f723f944..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/list_style_position_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/list_style_position.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ListStylePosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.ListStylePosition());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/list_style_type_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/list_style_type_custom.cc
deleted file mode 100644
index 1e76b7a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/list_style_type_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/list_style_type.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ListStyleType::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.ListStyleType());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
new file mode 100644
index 0000000..0b72727
--- /dev/null
+++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -0,0 +1,8219 @@
+// 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 "third_party/blink/renderer/core/css/basic_shape_functions.h"
+#include "third_party/blink/renderer/core/css/css_axis_value.h"
+#include "third_party/blink/renderer/core/css/css_color_value.h"
+#include "third_party/blink/renderer/core/css/css_counter_value.h"
+#include "third_party/blink/renderer/core/css/css_cursor_image_value.h"
+#include "third_party/blink/renderer/core/css/css_font_feature_value.h"
+#include "third_party/blink/renderer/core/css/css_font_variation_value.h"
+#include "third_party/blink/renderer/core/css/css_function_value.h"
+#include "third_party/blink/renderer/core/css/css_grid_template_areas_value.h"
+#include "third_party/blink/renderer/core/css/css_identifier_value.h"
+#include "third_party/blink/renderer/core/css/css_layout_function_value.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
+#include "third_party/blink/renderer/core/css/css_quad_value.h"
+#include "third_party/blink/renderer/core/css/css_reflect_value.h"
+#include "third_party/blink/renderer/core/css/css_resolution_units.h"
+#include "third_party/blink/renderer/core/css/css_string_value.h"
+#include "third_party/blink/renderer/core/css/css_uri_value.h"
+#include "third_party/blink/renderer/core/css/css_value_list.h"
+#include "third_party/blink/renderer/core/css/css_value_pair.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_mode.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_token.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
+#include "third_party/blink/renderer/core/css/parser/css_property_parser.h"
+#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_east_asian_parser.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_ligatures_parser.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_numeric_parser.h"
+#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
+#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/align_content.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/align_items.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/align_self.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/alignment_baseline.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_delay.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_direction.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_duration.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_fill_mode.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_iteration_count.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_name.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_play_state.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/animation_timing_function.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/backdrop_filter.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/backface_visibility.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_attachment.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_blend_mode.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_clip.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_image.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_origin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_position_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_position_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/background_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/baseline_shift.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/block_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_block_end_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_block_end_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_block_start_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_block_start_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_left_radius.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_right_radius.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_bottom_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_image_outset.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_image_repeat.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_image_slice.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_image_source.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_image_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_end_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_end_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_start_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_inline_start_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_left_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_left_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_left_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_right_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_right_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_right_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_top_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_top_left_radius.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_top_right_radius.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_top_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/border_top_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/bottom.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/box_shadow.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/box_sizing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/break_after.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/break_before.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/break_inside.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/buffered_rendering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/caption_side.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/caret_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/clear.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/clip.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/clip_path.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/clip_rule.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/color_interpolation.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/color_interpolation_filters.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/color_rendering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_count.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_fill.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_gap.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_rule_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_span.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/column_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/contain.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/content.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/counter_increment.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/counter_reset.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/cursor.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/cx.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/cy.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/d.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/direction.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/display.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/dominant_baseline.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/empty_cells.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/fill.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/fill_opacity.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/fill_rule.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/filter.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flex_basis.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flex_direction.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flex_grow.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flex_shrink.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flex_wrap.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/float.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flood_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/flood_opacity.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_family.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_feature_settings.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_kerning.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_size_adjust.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_stretch.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_caps.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_east_asian.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_ligatures.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_variant_numeric.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_variation_settings.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/font_weight.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_columns.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_flow.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_auto_rows.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_column_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_column_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_row_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_row_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_areas.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_columns.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/grid_template_rows.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/height.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/hyphens.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/image_orientation.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/image_rendering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/inline_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/inset_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/inset_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/inset_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/inset_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/isolation.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/justify_content.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/justify_items.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/justify_self.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/left.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/letter_spacing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/lighting_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/line_break.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/line_height.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/line_height_step.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/list_style_image.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/list_style_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/list_style_type.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_bottom.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_left.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_right.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/margin_top.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/marker_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/marker_mid.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/marker_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/mask.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/mask_source_type.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/mask_type.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/max_block_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/max_height.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/max_inline_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/max_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/min_block_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/min_height.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/min_inline_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/min_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/mix_blend_mode.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/object_fit.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/object_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/offset_anchor.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/offset_distance.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/offset_path.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/offset_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/offset_rotate.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/opacity.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/order.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/orphans.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/outline_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/outline_offset.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/outline_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/outline_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overflow_anchor.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overflow_wrap.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overflow_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overflow_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_bottom.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_left.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_right.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/padding_top.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/page.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/paint_order.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/perspective.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/perspective_origin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/pointer_events.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/quotes.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/r.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/resize.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/right.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/rotate.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/row_gap.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/rx.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/ry.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scale.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_behavior.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_customization.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_bottom.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_left.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_right.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_top.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_bottom.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_left.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_right.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_top.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_align.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_stop.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_type.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/shape_image_threshold.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/shape_margin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/shape_outside.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/shape_rendering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/speak.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stop_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stop_opacity.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_dasharray.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_dashoffset.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_linecap.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_linejoin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_miterlimit.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_opacity.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/stroke_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/tab_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/table_layout.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_align.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_align_last.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_anchor.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_combine_upright.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_line.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_skip_ink.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_indent.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_justify.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_orientation.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_overflow.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_rendering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_shadow.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_size_adjust.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_transform.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/text_underline_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/top.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/touch_action.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transform.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transform_box.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transform_origin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transform_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transition_delay.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transition_duration.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transition_property.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/transition_timing_function.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/translate.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/unicode_bidi.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/user_select.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/vector_effect.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/vertical_align.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/visibility.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_app_region.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_appearance.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_horizontal_spacing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_image.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_vertical_spacing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_align.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_decoration_break.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_direction.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_flex.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_ordinal_group.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_orient.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_pack.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_reflect.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_font_size_delta.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_font_smoothing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_highlight.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_hyphenate_character.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_line_break.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_line_clamp.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_locale.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_after_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_before_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_bottom_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_top_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_outset.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_repeat.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_slice.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_source.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_clip.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_composite.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_image.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_origin.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_size.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_print_color_adjust.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_rtl_ordering.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_ruby_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_tap_highlight_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_combine.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_decorations_in_effect.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_position.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_style.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_fill_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_orientation.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_security.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_color.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_z.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_user_drag.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_user_modify.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/webkit_writing_mode.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/white_space.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/widows.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/width.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/will_change.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/word_break.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/word_spacing.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/writing_mode.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/x.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/y.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/z_index.h"
+#include "third_party/blink/renderer/core/css/properties/longhands/zoom.h"
+#include "third_party/blink/renderer/core/css/resolver/style_builder_converter.h"
+#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
+#include "third_party/blink/renderer/core/css_value_keywords.h"
+#include "third_party/blink/renderer/core/frame/settings.h"
+#include "third_party/blink/renderer/core/frame/use_counter.h"
+#include "third_party/blink/renderer/core/frame/web_feature.h"
+#include "third_party/blink/renderer/core/layout/layout_box.h"
+#include "third_party/blink/renderer/core/layout/layout_object.h"
+#include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/core/style/grid_area.h"
+#include "third_party/blink/renderer/core/style/reference_clip_path_operation.h"
+#include "third_party/blink/renderer/core/style/shape_clip_path_operation.h"
+#include "third_party/blink/renderer/core/style_property_shorthand.h"
+#include "third_party/blink/renderer/platform/geometry/length.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+
+// Implementations of methods in Longhand subclasses that aren't generated.
+
+namespace blink {
+namespace css_longhand {
+
+const CSSValue* AlignContent::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeContentDistributionOverflowPosition(
+      range, css_parsing_utils::IsContentPositionKeyword);
+}
+
+const CSSValue* AlignContent::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::
+      ValueForContentPositionAndDistributionWithOverflowAlignment(
+          style.AlignContent());
+}
+
+const CSSValue* AlignItems::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // align-items property does not allow the 'auto' value.
+  if (css_property_parser_helpers::IdentMatches<CSSValueID::kAuto>(
+          range.Peek().Id()))
+    return nullptr;
+  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
+      range, css_parsing_utils::IsSelfPositionKeyword);
+}
+
+const CSSValue* AlignItems::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
+      style.AlignItems());
+}
+
+const CSSValue* AlignSelf::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
+      range, css_parsing_utils::IsSelfPositionKeyword);
+}
+
+const CSSValue* AlignSelf::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
+      style.AlignSelf());
+}
+const CSSValue* AlignmentBaseline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.AlignmentBaseline());
+}
+
+const CSSValue* AnimationDelay::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeTime, range, kValueRangeAll);
+}
+
+const CSSValue* AnimationDelay::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationDelay(style.Animations());
+}
+
+const CSSValue* AnimationDelay::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSValue>, value,
+      (CSSPrimitiveValue::Create(CSSTimingData::InitialDelay(),
+                                 CSSPrimitiveValue::UnitType::kSeconds)));
+  return value;
+}
+
+const CSSValue* AnimationDirection::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kNormal, CSSValueID::kAlternate, CSSValueID::kReverse,
+          CSSValueID::kAlternateReverse>,
+      range);
+}
+
+const CSSValue* AnimationDirection::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    for (wtf_size_t i = 0; i < animation_data->DirectionList().size(); ++i) {
+      list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
+          animation_data->DirectionList()[i]));
+    }
+  } else {
+    list->Append(*InitialValue());
+  }
+  return list;
+}
+
+const CSSValue* AnimationDirection::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kNormal)));
+  return value;
+}
+
+const CSSValue* AnimationDuration::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeTime, range, kValueRangeNonNegative);
+}
+
+const CSSValue* AnimationDuration::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationDuration(style.Animations());
+}
+
+const CSSValue* AnimationDuration::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSValue>, value,
+      (CSSPrimitiveValue::Create(CSSTimingData::InitialDuration(),
+                                 CSSPrimitiveValue::UnitType::kSeconds)));
+  return value;
+}
+
+const CSSValue* AnimationFillMode::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kNone, CSSValueID::kForwards, CSSValueID::kBackwards,
+          CSSValueID::kBoth>,
+      range);
+}
+
+const CSSValue* AnimationFillMode::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    for (wtf_size_t i = 0; i < animation_data->FillModeList().size(); ++i) {
+      list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
+          animation_data->FillModeList()[i]));
+    }
+  } else {
+    list->Append(*InitialValue());
+  }
+  return list;
+}
+
+const CSSValue* AnimationFillMode::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
+  return value;
+}
+
+const CSSValue* AnimationIterationCount::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeAnimationIterationCount, range);
+}
+
+const CSSValue* AnimationIterationCount::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    for (wtf_size_t i = 0; i < animation_data->IterationCountList().size();
+         ++i) {
+      list->Append(*ComputedStyleUtils::ValueForAnimationIterationCount(
+          animation_data->IterationCountList()[i]));
+    }
+  } else {
+    list->Append(*InitialValue());
+  }
+  return list;
+}
+
+const CSSValue* AnimationIterationCount::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSValue>, value,
+      (CSSPrimitiveValue::Create(CSSAnimationData::InitialIterationCount(),
+                                 CSSPrimitiveValue::UnitType::kNumber)));
+  return value;
+}
+
+const CSSValue* AnimationName::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  // Allow quoted name if this is an alias property.
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeAnimationName, range, context,
+      local_context.UseAliasParsing());
+}
+
+const CSSValue* AnimationName::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) {
+      list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
+          animation_data->NameList()[i]));
+    }
+  } else {
+    list->Append(*InitialValue());
+  }
+  return list;
+}
+
+const CSSValue* AnimationName::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
+  return value;
+}
+
+const CSSValue* AnimationPlayState::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kRunning,
+                                                CSSValueID::kPaused>,
+      range);
+}
+
+const CSSValue* AnimationPlayState::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    for (wtf_size_t i = 0; i < animation_data->PlayStateList().size(); ++i) {
+      list->Append(*ComputedStyleUtils::ValueForAnimationPlayState(
+          animation_data->PlayStateList()[i]));
+    }
+  } else {
+    list->Append(*InitialValue());
+  }
+  return list;
+}
+
+const CSSValue* AnimationPlayState::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kRunning)));
+  return value;
+}
+
+const CSSValue* AnimationTimingFunction::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeAnimationTimingFunction, range);
+}
+
+const CSSValue* AnimationTimingFunction::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationTimingFunction(
+      style.Animations());
+}
+
+const CSSValue* AnimationTimingFunction::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kEase)));
+  return value;
+}
+
+const CSSValue* BackdropFilter::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeFilterFunctionList(range, context);
+}
+
+const CSSValue* BackdropFilter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFilter(style, style.BackdropFilter());
+}
+const CSSValue* BackfaceVisibility::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(
+      (style.BackfaceVisibility() == EBackfaceVisibility::kHidden)
+          ? CSSValueID::kHidden
+          : CSSValueID::kVisible);
+}
+
+const CSSValue* BackgroundAttachment::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeBackgroundAttachment, range);
+}
+
+const CSSValue* BackgroundAttachment::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  for (const FillLayer* curr_layer = &style.BackgroundLayers(); curr_layer;
+       curr_layer = curr_layer->Next())
+    list->Append(*CSSIdentifierValue::Create(curr_layer->Attachment()));
+  return list;
+}
+
+const CSSValue* BackgroundBlendMode::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeBackgroundBlendMode, range);
+}
+
+const CSSValue* BackgroundBlendMode::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  for (const FillLayer* curr_layer = &style.BackgroundLayers(); curr_layer;
+       curr_layer = curr_layer->Next())
+    list->Append(*CSSIdentifierValue::Create(curr_layer->GetBlendMode()));
+  return list;
+}
+
+const CSSValue* BackgroundClip::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBackgroundBox(
+      range, local_context, css_parsing_utils::AllowTextValue::kAllow);
+}
+
+const CSSValue* BackgroundClip::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const FillLayer* curr_layer = &style.BackgroundLayers();
+  for (; curr_layer; curr_layer = curr_layer->Next()) {
+    EFillBox box = curr_layer->Clip();
+    list->Append(*CSSIdentifierValue::Create(box));
+  }
+  return list;
+}
+
+const CSSValue* BackgroundColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(
+      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
+}
+
+const blink::Color BackgroundColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor style_color = visited_link ? style.VisitedLinkBackgroundColor()
+                                        : style.BackgroundColor();
+  blink::Color result =
+      visited_link ? style.VisitedLinkColor() : style.GetColor();
+  if (!style_color.IsCurrentColor())
+    result = style_color.GetColor();
+
+  // FIXME: Technically someone could explicitly specify the color transparent,
+  // but for now we'll just assume that if the background color is transparent
+  // that it wasn't set. Note that it's weird that we're returning unvisited
+  // info for a visited link, but given our restriction that the alpha values
+  // have to match, it makes more sense to return the unvisited background color
+  // if specified than it does to return black. This behavior matches what
+  // Firefox 4 does as well.
+  if (visited_link && result == blink::Color::kTransparent)
+    return ColorIncludingFallback(false, style);
+
+  return result;
+}
+
+const CSSValue* BackgroundColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.BackgroundColor());
+}
+
+const CSSValue* BackgroundImage::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeImageOrNone, range, &context);
+}
+
+const CSSValue* BackgroundImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer& fill_layer = style.BackgroundLayers();
+  return ComputedStyleUtils::BackgroundImageOrWebkitMaskImage(fill_layer);
+}
+
+const CSSValue* BackgroundOrigin::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBackgroundBox(
+      range, local_context, css_parsing_utils::AllowTextValue::kForbid);
+}
+
+const CSSValue* BackgroundOrigin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const FillLayer* curr_layer = &style.BackgroundLayers();
+  for (; curr_layer; curr_layer = curr_layer->Next()) {
+    EFillBox box = curr_layer->Origin();
+    list->Append(*CSSIdentifierValue::Create(box));
+  }
+  return list;
+}
+
+const CSSValue* BackgroundPositionX::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
+                                                 CSSValueID::kRight>,
+      range, context.Mode());
+}
+
+const CSSValue* BackgroundPositionX::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer* curr_layer = &style.BackgroundLayers();
+  return ComputedStyleUtils::BackgroundPositionXOrWebkitMaskPositionX(
+      style, curr_layer);
+}
+
+const CSSValue* BackgroundPositionY::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
+                                                 CSSValueID::kBottom>,
+      range, context.Mode());
+}
+
+const CSSValue* BackgroundPositionY::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer* curr_layer = &style.BackgroundLayers();
+  return ComputedStyleUtils::BackgroundPositionYOrWebkitMaskPositionY(
+      style, curr_layer);
+}
+
+const CSSValue* BackgroundSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBackgroundOrMaskSize(
+      range, context, local_context, WebFeature::kNegativeBackgroundSize);
+}
+
+const CSSValue* BackgroundSize::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer& fill_layer = style.BackgroundLayers();
+  return ComputedStyleUtils::BackgroundImageOrWebkitMaskSize(style, fill_layer);
+}
+
+const CSSValue* BaselineShift::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kBaseline || id == CSSValueID::kSub ||
+      id == CSSValueID::kSuper)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, kSVGAttributeMode, kValueRangeAll);
+}
+
+const CSSValue* BaselineShift::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  switch (svg_style.BaselineShift()) {
+    case BS_SUPER:
+      return CSSIdentifierValue::Create(CSSValueID::kSuper);
+    case BS_SUB:
+      return CSSIdentifierValue::Create(CSSValueID::kSub);
+    case BS_LENGTH:
+      return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+          svg_style.BaselineShiftValue(), style);
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+void BaselineShift::ApplyInherit(StyleResolverState& state) const {
+  const SVGComputedStyle& parent_svg_style = state.ParentStyle()->SvgStyle();
+  EBaselineShift baseline_shift = parent_svg_style.BaselineShift();
+  SVGComputedStyle& svg_style = state.Style()->AccessSVGStyle();
+  svg_style.SetBaselineShift(baseline_shift);
+  if (baseline_shift == BS_LENGTH)
+    svg_style.SetBaselineShiftValue(parent_svg_style.BaselineShiftValue());
+}
+
+void BaselineShift::ApplyValue(StyleResolverState& state,
+                               const CSSValue& value) const {
+  SVGComputedStyle& svg_style = state.Style()->AccessSVGStyle();
+  auto* identifier_value = DynamicTo<CSSIdentifierValue>(value);
+  if (!identifier_value) {
+    svg_style.SetBaselineShift(BS_LENGTH);
+    svg_style.SetBaselineShiftValue(StyleBuilderConverter::ConvertLength(
+        state, To<CSSPrimitiveValue>(value)));
+    return;
+  }
+  switch (identifier_value->GetValueID()) {
+    case CSSValueID::kBaseline:
+      svg_style.SetBaselineShift(BS_LENGTH);
+      svg_style.SetBaselineShiftValue(Length::Fixed());
+      return;
+    case CSSValueID::kSub:
+      svg_style.SetBaselineShift(BS_SUB);
+      return;
+    case CSSValueID::kSuper:
+      svg_style.SetBaselineShift(BS_SUPER);
+      return;
+    default:
+      NOTREACHED();
+  }
+}
+
+const CSSValue* BlockSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
+}
+
+bool BlockSize::IsLayoutDependent(const ComputedStyle* style,
+                                  LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* BorderBlockEndColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const CSSValue* BorderBlockEndWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* BorderBlockStartColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const CSSValue* BorderBlockStartWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* BorderBottomColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeBorderColorSide(range, context,
+                                                   local_context);
+}
+
+const blink::Color BorderBottomColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkBorderBottomColor()
+                                   : style.BorderBottomColor();
+  EBorderStyle border_style = style.BorderBottomStyle();
+  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
+                                             visited_link);
+}
+
+const CSSValue* BorderBottomColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.BorderBottomColor());
+}
+
+const CSSValue* BorderBottomLeftRadius::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
+}
+
+const CSSValue* BorderBottomLeftRadius::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+      style.BorderBottomLeftRadius(), style);
+}
+
+const CSSValue* BorderBottomRightRadius::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
+}
+
+const CSSValue* BorderBottomRightRadius::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+      style.BorderBottomRightRadius(), style);
+}
+const CSSValue* BorderBottomStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BorderBottomStyle());
+}
+
+const CSSValue* BorderBottomWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
+}
+
+const CSSValue* BorderBottomWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.BorderBottomWidth(), style);
+}
+
+const CSSValue* BorderCollapse::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.BorderCollapse() == EBorderCollapse::kCollapse)
+    return CSSIdentifierValue::Create(CSSValueID::kCollapse);
+  return CSSIdentifierValue::Create(CSSValueID::kSeparate);
+}
+
+const CSSValue* BorderImageOutset::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageOutset(range);
+}
+
+const CSSValue* BorderImageOutset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageQuad(
+      style.BorderImage().Outset(), style);
+}
+
+const CSSValue* BorderImageOutset::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSQuadValue>, value,
+      (CSSQuadValue::Create(
+          CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kInteger),
+          CSSQuadValue::kSerializeAsQuad)));
+  return value;
+}
+
+const CSSValue* BorderImageRepeat::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageRepeat(range);
+}
+
+const CSSValue* BorderImageRepeat::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageRepeat(style.BorderImage());
+}
+
+const CSSValue* BorderImageRepeat::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kStretch)));
+  return value;
+}
+
+const CSSValue* BorderImageSlice::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageSlice(
+      range, css_parsing_utils::DefaultFill::kNoFill);
+}
+
+const CSSValue* BorderImageSlice::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageSlice(style.BorderImage());
+}
+
+const CSSValue* BorderImageSlice::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSBorderImageSliceValue>, value,
+      (MakeGarbageCollected<CSSBorderImageSliceValue>(
+          CSSQuadValue::Create(
+              CSSPrimitiveValue::Create(
+                  100, CSSPrimitiveValue::UnitType::kPercentage),
+              CSSQuadValue::kSerializeAsQuad),
+          /* fill */ false)));
+  return value;
+}
+
+const CSSValue* BorderImageSource::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
+}
+
+const CSSValue* BorderImageSource::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  if (style.BorderImageSource())
+    return style.BorderImageSource()->ComputedCSSValue();
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* BorderImageSource::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kNone)));
+  return value;
+}
+
+void BorderImageSource::ApplyValue(StyleResolverState& state,
+                                   const CSSValue& value) const {
+  state.Style()->SetBorderImageSource(
+      state.GetStyleImage(CSSPropertyID::kBorderImageSource, value));
+}
+
+const CSSValue* BorderImageWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageWidth(range);
+}
+
+const CSSValue* BorderImageWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageQuad(
+      style.BorderImage().BorderSlices(), style);
+}
+
+const CSSValue* BorderImageWidth::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSQuadValue>, value,
+      (CSSQuadValue::Create(
+          CSSPrimitiveValue::Create(1, CSSPrimitiveValue::UnitType::kInteger),
+          CSSQuadValue::kSerializeAsQuad)));
+  return value;
+}
+
+const CSSValue* BorderInlineEndColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const CSSValue* BorderInlineEndWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* BorderInlineStartColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const CSSValue* BorderInlineStartWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* BorderLeftColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeBorderColorSide(range, context,
+                                                   local_context);
+}
+
+const blink::Color BorderLeftColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkBorderLeftColor()
+                                   : style.BorderLeftColor();
+  EBorderStyle border_style = style.BorderLeftStyle();
+  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
+                                             visited_link);
+}
+
+const CSSValue* BorderLeftColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.BorderLeftColor());
+}
+
+const CSSValue* BorderLeftStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BorderLeftStyle());
+}
+
+const CSSValue* BorderLeftWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
+}
+
+const CSSValue* BorderLeftWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.BorderLeftWidth(), style);
+}
+
+const CSSValue* BorderRightColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeBorderColorSide(range, context,
+                                                   local_context);
+}
+
+const blink::Color BorderRightColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkBorderRightColor()
+                                   : style.BorderRightColor();
+  EBorderStyle border_style = style.BorderRightStyle();
+  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
+                                             visited_link);
+}
+
+const CSSValue* BorderRightColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.BorderRightColor());
+}
+
+const CSSValue* BorderRightStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BorderRightStyle());
+}
+
+const CSSValue* BorderRightWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
+}
+
+const CSSValue* BorderRightWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.BorderRightWidth(), style);
+}
+
+const CSSValue* BorderTopColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeBorderColorSide(range, context,
+                                                   local_context);
+}
+
+const blink::Color BorderTopColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result =
+      visited_link ? style.VisitedLinkBorderTopColor() : style.BorderTopColor();
+  EBorderStyle border_style = style.BorderTopStyle();
+  return ComputedStyleUtils::BorderSideColor(style, result, border_style,
+                                             visited_link);
+}
+
+const CSSValue* BorderTopColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style
+             ? cssvalue::CSSColorValue::Create(
+                   style.VisitedDependentColor(*this).Rgb())
+             : ComputedStyleUtils::ComputedStyleUtils::CurrentColorOrValidColor(
+                   style, style.BorderTopColor());
+}
+
+const CSSValue* BorderTopLeftRadius::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
+}
+
+const CSSValue* BorderTopLeftRadius::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+      style.BorderTopLeftRadius(), style);
+}
+
+const CSSValue* BorderTopRightRadius::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseBorderRadiusCorner(range, context);
+}
+
+const CSSValue* BorderTopRightRadius::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return &ComputedStyleUtils::ValueForBorderRadiusCorner(
+      style.BorderTopRightRadius(), style);
+}
+
+const CSSValue* BorderTopStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BorderTopStyle());
+}
+
+const CSSValue* BorderTopWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBorderWidthSide(range, context, local_context);
+}
+
+const CSSValue* BorderTopWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.BorderTopWidth(), style);
+}
+
+const CSSValue* Bottom::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_parsing_utils::UnitlessUnlessShorthand(local_context));
+}
+
+bool Bottom::IsLayoutDependent(const ComputedStyle* style,
+                               LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* Bottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
+                                                    layout_object);
+}
+
+const CSSValue* BoxShadow::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeShadow(
+      range, context.Mode(), css_parsing_utils::AllowInsetAndSpread::kAllow);
+}
+
+const CSSValue* BoxShadow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForShadowList(style.BoxShadow(), style, true);
+}
+
+const CSSValue* BoxSizing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.BoxSizing() == EBoxSizing::kContentBox)
+    return CSSIdentifierValue::Create(CSSValueID::kContentBox);
+  return CSSIdentifierValue::Create(CSSValueID::kBorderBox);
+}
+
+const CSSValue* BreakAfter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BreakAfter());
+}
+
+const CSSValue* BreakBefore::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BreakBefore());
+}
+
+const CSSValue* BreakInside::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BreakInside());
+}
+
+const CSSValue* BufferedRendering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.BufferedRendering());
+}
+
+const CSSValue* CaptionSide::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.CaptionSide());
+}
+
+const CSSValue* CaretColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color CaretColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleAutoColor auto_color =
+      visited_link ? style.VisitedLinkCaretColor() : style.CaretColor();
+  // TODO(rego): We may want to adjust the caret color if it's the same as
+  // the background to ensure good visibility and contrast.
+  StyleColor result = auto_color.IsAutoColor() ? StyleColor::CurrentColor()
+                                               : auto_color.ToStyleColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* CaretColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  blink::Color color;
+  if (allow_visited_style)
+    color = style.VisitedDependentColor(*this);
+  else if (style.CaretColor().IsAutoColor())
+    color = StyleColor::CurrentColor().Resolve(style.GetColor());
+  else
+    color = style.CaretColor().ToStyleColor().Resolve(style.GetColor());
+  return cssvalue::CSSColorValue::Create(color.Rgb());
+}
+
+void CaretColor::ApplyInitial(StyleResolverState& state) const {
+  StyleAutoColor color = StyleAutoColor::AutoColor();
+  if (state.ApplyPropertyToRegularStyle())
+    state.Style()->SetCaretColor(color);
+  if (state.ApplyPropertyToVisitedLinkStyle())
+    state.Style()->SetVisitedLinkCaretColor(color);
+}
+
+void CaretColor::ApplyInherit(StyleResolverState& state) const {
+  StyleAutoColor color = state.ParentStyle()->CaretColor();
+  if (state.ApplyPropertyToRegularStyle())
+    state.Style()->SetCaretColor(color);
+  if (state.ApplyPropertyToVisitedLinkStyle())
+    state.Style()->SetVisitedLinkCaretColor(color);
+}
+
+void CaretColor::ApplyValue(StyleResolverState& state,
+                            const CSSValue& value) const {
+  if (state.ApplyPropertyToRegularStyle()) {
+    state.Style()->SetCaretColor(
+        StyleBuilderConverter::ConvertStyleAutoColor(state, value));
+  }
+  if (state.ApplyPropertyToVisitedLinkStyle()) {
+    state.Style()->SetVisitedLinkCaretColor(
+        StyleBuilderConverter::ConvertStyleAutoColor(state, value, true));
+  }
+}
+
+const CSSValue* Clear::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Clear());
+}
+
+namespace {
+
+CSSValue* ConsumeClipComponent(CSSParserTokenRange& range,
+                               CSSParserMode css_parser_mode) {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeLength(
+      range, css_parser_mode, kValueRangeAll,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+}  // namespace
+
+const CSSValue* Clip::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  if (range.Peek().FunctionId() != CSSValueID::kRect)
+    return nullptr;
+
+  CSSParserTokenRange args =
+      css_property_parser_helpers::ConsumeFunction(range);
+  // rect(t, r, b, l) || rect(t r b l)
+  CSSValue* top = ConsumeClipComponent(args, context.Mode());
+  if (!top)
+    return nullptr;
+  bool needs_comma =
+      css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args);
+  CSSValue* right = ConsumeClipComponent(args, context.Mode());
+  if (!right ||
+      (needs_comma &&
+       !css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)))
+    return nullptr;
+  CSSValue* bottom = ConsumeClipComponent(args, context.Mode());
+  if (!bottom ||
+      (needs_comma &&
+       !css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)))
+    return nullptr;
+  CSSValue* left = ConsumeClipComponent(args, context.Mode());
+  if (!left || !args.AtEnd())
+    return nullptr;
+  return MakeGarbageCollected<CSSQuadValue>(top, right, bottom, left,
+                                            CSSQuadValue::kSerializeAsRect);
+}
+
+const CSSValue* Clip::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasAutoClip())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  CSSValue* top = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
+      style.Clip().Top(), style);
+  CSSValue* right = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
+      style.Clip().Right(), style);
+  CSSValue* bottom = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
+      style.Clip().Bottom(), style);
+  CSSValue* left = ComputedStyleUtils::ZoomAdjustedPixelValueOrAuto(
+      style.Clip().Left(), style);
+  return MakeGarbageCollected<CSSQuadValue>(top, right, bottom, left,
+                                            CSSQuadValue::kSerializeAsRect);
+}
+
+const CSSValue* ClipPath::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext& context,
+                                           const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  if (cssvalue::CSSURIValue* url =
+          css_property_parser_helpers::ConsumeUrl(range, &context))
+    return url;
+  return css_parsing_utils::ConsumeBasicShape(range, context);
+}
+
+const CSSValue* ClipPath::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (ClipPathOperation* operation = style.ClipPath()) {
+    if (operation->GetType() == ClipPathOperation::SHAPE) {
+      return ValueForBasicShape(
+          style, To<ShapeClipPathOperation>(operation)->GetBasicShape());
+    }
+    if (operation->GetType() == ClipPathOperation::REFERENCE) {
+      return cssvalue::CSSURIValue::Create(
+          To<ReferenceClipPathOperation>(operation)->Url());
+    }
+  }
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* ClipRule::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.ClipRule());
+}
+
+const CSSValue* Color::ParseSingleValue(CSSParserTokenRange& range,
+                                        const CSSParserContext& context,
+                                        const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(
+      range, context.Mode(), IsQuirksModeBehavior(context.Mode()));
+}
+
+const blink::Color Color::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result =
+      visited_link ? style.VisitedLinkColor() : style.GetColor();
+  ;
+  return result.GetColor();
+}
+
+const CSSValue* Color::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return cssvalue::CSSColorValue::Create(
+      allow_visited_style ? style.VisitedDependentColor(*this).Rgb()
+                          : style.GetColor().Rgb());
+}
+
+void Color::ApplyInitial(StyleResolverState& state) const {
+  blink::Color color = ComputedStyleInitialValues::InitialColor();
+  if (state.ApplyPropertyToRegularStyle())
+    state.Style()->SetColor(color);
+  if (state.ApplyPropertyToVisitedLinkStyle())
+    state.Style()->SetVisitedLinkColor(color);
+}
+
+void Color::ApplyInherit(StyleResolverState& state) const {
+  blink::Color color = state.ParentStyle()->GetColor();
+  if (state.ApplyPropertyToRegularStyle())
+    state.Style()->SetColor(color);
+  if (state.ApplyPropertyToVisitedLinkStyle())
+    state.Style()->SetVisitedLinkColor(color);
+}
+
+void Color::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
+  // As per the spec, 'color: currentColor' is treated as 'color: inherit'
+  auto* identifier_value = DynamicTo<CSSIdentifierValue>(value);
+  if (identifier_value &&
+      identifier_value->GetValueID() == CSSValueID::kCurrentcolor) {
+    ApplyInherit(state);
+    return;
+  }
+
+  if (state.ApplyPropertyToRegularStyle())
+    state.Style()->SetColor(StyleBuilderConverter::ConvertColor(state, value));
+  if (state.ApplyPropertyToVisitedLinkStyle()) {
+    state.Style()->SetVisitedLinkColor(
+        StyleBuilderConverter::ConvertColor(state, value, true));
+  }
+}
+
+const CSSValue* ColorInterpolation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.ColorInterpolation());
+}
+
+const CSSValue* ColorInterpolationFilters::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.ColorInterpolationFilters());
+}
+
+const CSSValue* ColorRendering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.ColorRendering());
+}
+
+const CSSValue* ColumnCount::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeColumnCount(range);
+}
+
+const CSSValue* ColumnCount::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasAutoColumnCount())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return CSSPrimitiveValue::Create(style.ColumnCount(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* ColumnFill::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetColumnFill());
+}
+
+const CSSValue* ColumnGap::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGapLength(range, context);
+}
+
+const CSSValue* ColumnGap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool) const {
+  return ComputedStyleUtils::ValueForGapLength(style.ColumnGap(), style);
+}
+
+const CSSValue* ColumnRuleColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color ColumnRuleColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkColumnRuleColor()
+                                   : style.ColumnRuleColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* ColumnRuleColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.ColumnRuleColor());
+}
+
+const CSSValue* ColumnRuleStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.ColumnRuleStyle());
+}
+
+const CSSValue* ColumnRuleWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLineWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ColumnRuleWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.ColumnRuleWidth(), style);
+}
+
+const CSSValue* ColumnSpan::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeIdent<CSSValueID::kAll,
+                                                   CSSValueID::kNone>(range);
+}
+
+const CSSValue* ColumnSpan::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(static_cast<unsigned>(style.GetColumnSpan())
+                                        ? CSSValueID::kAll
+                                        : CSSValueID::kNone);
+}
+
+const CSSValue* ColumnWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeColumnWidth(range);
+}
+
+const CSSValue* ColumnWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasAutoColumnWidth())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return ZoomAdjustedPixelValue(style.ColumnWidth(), style);
+}
+
+// none | strict | content | [ size || layout || style || paint ]
+const CSSValue* Contain::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (id == CSSValueID::kStrict || id == CSSValueID::kContent) {
+    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
+    return list;
+  }
+
+  CSSIdentifierValue* size = nullptr;
+  CSSIdentifierValue* layout = nullptr;
+  CSSIdentifierValue* style = nullptr;
+  CSSIdentifierValue* paint = nullptr;
+  while (true) {
+    id = range.Peek().Id();
+    if (id == CSSValueID::kSize && !size)
+      size = css_property_parser_helpers::ConsumeIdent(range);
+    else if (id == CSSValueID::kLayout && !layout)
+      layout = css_property_parser_helpers::ConsumeIdent(range);
+    else if (id == CSSValueID::kStyle && !style)
+      style = css_property_parser_helpers::ConsumeIdent(range);
+    else if (id == CSSValueID::kPaint && !paint)
+      paint = css_property_parser_helpers::ConsumeIdent(range);
+    else
+      break;
+  }
+  if (size)
+    list->Append(*size);
+  if (layout)
+    list->Append(*layout);
+  if (style)
+    list->Append(*style);
+  if (paint)
+    list->Append(*paint);
+  if (!list->length())
+    return nullptr;
+  return list;
+}
+
+const CSSValue* Contain::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.Contain())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  if (style.Contain() == kContainsStrict)
+    return CSSIdentifierValue::Create(CSSValueID::kStrict);
+  if (style.Contain() == kContainsContent)
+    return CSSIdentifierValue::Create(CSSValueID::kContent);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (style.ContainsSize())
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kSize));
+  if (style.Contain() & kContainsLayout)
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kLayout));
+  if (style.ContainsStyle())
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kStyle));
+  if (style.ContainsPaint())
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kPaint));
+  DCHECK(list->length());
+  return list;
+}
+
+namespace {
+
+CSSValue* ConsumeAttr(CSSParserTokenRange args,
+                      const CSSParserContext& context) {
+  if (args.Peek().GetType() != kIdentToken)
+    return nullptr;
+
+  AtomicString attr_name =
+      args.ConsumeIncludingWhitespace().Value().ToAtomicString();
+  if (!args.AtEnd())
+    return nullptr;
+
+  if (context.IsHTMLDocument())
+    attr_name = attr_name.LowerASCII();
+
+  CSSFunctionValue* attr_value =
+      MakeGarbageCollected<CSSFunctionValue>(CSSValueID::kAttr);
+  attr_value->Append(*MakeGarbageCollected<CSSCustomIdentValue>(attr_name));
+  return attr_value;
+}
+
+CSSValue* ConsumeCounterContent(CSSParserTokenRange args,
+                                const CSSParserContext& context,
+                                bool counters) {
+  CSSCustomIdentValue* identifier =
+      css_property_parser_helpers::ConsumeCustomIdent(args, context);
+  if (!identifier)
+    return nullptr;
+
+  CSSStringValue* separator = nullptr;
+  if (!counters) {
+    separator = MakeGarbageCollected<CSSStringValue>(String());
+  } else {
+    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args) ||
+        args.Peek().GetType() != kStringToken)
+      return nullptr;
+    separator = MakeGarbageCollected<CSSStringValue>(
+        args.ConsumeIncludingWhitespace().Value().ToString());
+  }
+
+  CSSIdentifierValue* list_style = nullptr;
+  if (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(args)) {
+    CSSValueID id = args.Peek().Id();
+    if ((id != CSSValueID::kNone &&
+         (id < CSSValueID::kDisc || id > CSSValueID::kKatakanaIroha)))
+      return nullptr;
+    list_style = css_property_parser_helpers::ConsumeIdent(args);
+  } else {
+    list_style = CSSIdentifierValue::Create(CSSValueID::kDecimal);
+  }
+
+  if (!args.AtEnd())
+    return nullptr;
+  return MakeGarbageCollected<cssvalue::CSSCounterValue>(identifier, list_style,
+                                                         separator);
+}
+
+}  // namespace
+
+const CSSValue* Content::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  if (css_property_parser_helpers::IdentMatches<CSSValueID::kNone,
+                                                CSSValueID::kNormal>(
+          range.Peek().Id()))
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValueList* values = CSSValueList::CreateSpaceSeparated();
+
+  do {
+    CSSValue* parsed_value =
+        css_property_parser_helpers::ConsumeImage(range, &context);
+    if (!parsed_value) {
+      parsed_value = css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kOpenQuote, CSSValueID::kCloseQuote,
+          CSSValueID::kNoOpenQuote, CSSValueID::kNoCloseQuote>(range);
+    }
+    if (!parsed_value)
+      parsed_value = css_property_parser_helpers::ConsumeString(range);
+    if (!parsed_value) {
+      if (range.Peek().FunctionId() == CSSValueID::kAttr) {
+        parsed_value = ConsumeAttr(
+            css_property_parser_helpers::ConsumeFunction(range), context);
+      } else if (range.Peek().FunctionId() == CSSValueID::kCounter) {
+        parsed_value = ConsumeCounterContent(
+            css_property_parser_helpers::ConsumeFunction(range), context,
+            false);
+      } else if (range.Peek().FunctionId() == CSSValueID::kCounters) {
+        parsed_value = ConsumeCounterContent(
+            css_property_parser_helpers::ConsumeFunction(range), context, true);
+      }
+      if (!parsed_value)
+        return nullptr;
+    }
+    values->Append(*parsed_value);
+  } while (!range.AtEnd());
+
+  return values;
+}
+
+const CSSValue* Content::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForContentData(style);
+}
+
+void Content::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetContent(nullptr);
+}
+
+void Content::ApplyInherit(StyleResolverState& state) const {
+  // FIXME: In CSS3, it will be possible to inherit content. In CSS2 it is not.
+  // This note is a reminder that eventually "inherit" needs to be supported.
+}
+
+void Content::ApplyValue(StyleResolverState& state,
+                         const CSSValue& value) const {
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    DCHECK(identifier_value->GetValueID() == CSSValueID::kNormal ||
+           identifier_value->GetValueID() == CSSValueID::kNone);
+    state.Style()->SetContent(nullptr);
+    return;
+  }
+
+  ContentData* first_content = nullptr;
+  ContentData* prev_content = nullptr;
+  for (auto& item : To<CSSValueList>(value)) {
+    ContentData* next_content = nullptr;
+    if (item->IsImageGeneratorValue() || item->IsImageSetValue() ||
+        item->IsImageValue()) {
+      next_content = ContentData::Create(
+          state.GetStyleImage(CSSPropertyID::kContent, *item));
+    } else if (const auto* counter_value =
+                   DynamicTo<cssvalue::CSSCounterValue>(item.Get())) {
+      const auto list_style_type =
+          CssValueIDToPlatformEnum<EListStyleType>(counter_value->ListStyle());
+      std::unique_ptr<CounterContent> counter =
+          std::make_unique<CounterContent>(
+              AtomicString(counter_value->Identifier()), list_style_type,
+              AtomicString(counter_value->Separator()));
+      next_content = ContentData::Create(std::move(counter));
+    } else if (auto* item_identifier_value =
+                   DynamicTo<CSSIdentifierValue>(item.Get())) {
+      QuoteType quote_type;
+      switch (item_identifier_value->GetValueID()) {
+        default:
+          NOTREACHED();
+          FALLTHROUGH;
+        case CSSValueID::kOpenQuote:
+          quote_type = QuoteType::kOpen;
+          break;
+        case CSSValueID::kCloseQuote:
+          quote_type = QuoteType::kClose;
+          break;
+        case CSSValueID::kNoOpenQuote:
+          quote_type = QuoteType::kNoOpen;
+          break;
+        case CSSValueID::kNoCloseQuote:
+          quote_type = QuoteType::kNoClose;
+          break;
+      }
+      next_content = ContentData::Create(quote_type);
+    } else {
+      String string;
+      if (const auto* function_value =
+              DynamicTo<CSSFunctionValue>(item.Get())) {
+        DCHECK_EQ(function_value->FunctionType(), CSSValueID::kAttr);
+        state.Style()->SetHasAttrContent();
+        // TODO: Can a namespace be specified for an attr(foo)?
+        QualifiedName attr(
+            g_null_atom,
+            To<CSSCustomIdentValue>(function_value->Item(0)).Value(),
+            g_null_atom);
+        const AtomicString& attr_value = state.GetElement()->getAttribute(attr);
+        string = attr_value.IsNull() ? g_empty_string : attr_value.GetString();
+      } else {
+        string = To<CSSStringValue>(*item).Value();
+      }
+      if (prev_content && prev_content->IsText()) {
+        TextContentData* text_content = To<TextContentData>(prev_content);
+        text_content->SetText(text_content->GetText() + string);
+        continue;
+      }
+      next_content = ContentData::Create(string);
+    }
+
+    if (!first_content)
+      first_content = next_content;
+    else
+      prev_content->SetNext(next_content);
+
+    prev_content = next_content;
+  }
+  DCHECK(first_content);
+  state.Style()->SetContent(first_content);
+}
+
+const int kCounterIncrementDefaultValue = 1;
+
+const CSSValue* CounterIncrement::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeCounter(range, context,
+                                           kCounterIncrementDefaultValue);
+}
+
+const CSSValue* CounterIncrement::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForCounterDirectives(style, true);
+}
+
+const int kCounterResetDefaultValue = 0;
+
+const CSSValue* CounterReset::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeCounter(range, context,
+                                           kCounterResetDefaultValue);
+}
+
+const CSSValue* CounterReset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForCounterDirectives(style, false);
+}
+
+const CSSValue* Cursor::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  bool in_quirks_mode = IsQuirksModeBehavior(context.Mode());
+  CSSValueList* list = nullptr;
+  while (
+      CSSValue* image = css_property_parser_helpers::ConsumeImage(
+          range, &context,
+          css_property_parser_helpers::ConsumeGeneratedImagePolicy::kForbid)) {
+    double num;
+    IntPoint hot_spot(-1, -1);
+    bool hot_spot_specified = false;
+    if (css_property_parser_helpers::ConsumeNumberRaw(range, num)) {
+      hot_spot.SetX(clampTo<int>(num));
+      if (!css_property_parser_helpers::ConsumeNumberRaw(range, num))
+        return nullptr;
+      hot_spot.SetY(clampTo<int>(num));
+      hot_spot_specified = true;
+    }
+
+    if (!list)
+      list = CSSValueList::CreateCommaSeparated();
+
+    list->Append(*MakeGarbageCollected<cssvalue::CSSCursorImageValue>(
+        *image, hot_spot_specified, hot_spot));
+    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range))
+      return nullptr;
+  }
+
+  CSSValueID id = range.Peek().Id();
+  if (!range.AtEnd()) {
+    if (id == CSSValueID::kWebkitZoomIn)
+      context.Count(WebFeature::kPrefixedCursorZoomIn);
+    else if (id == CSSValueID::kWebkitZoomOut)
+      context.Count(WebFeature::kPrefixedCursorZoomOut);
+    else if (id == CSSValueID::kWebkitGrab)
+      context.Count(WebFeature::kPrefixedCursorGrab);
+    else if (id == CSSValueID::kWebkitGrabbing)
+      context.Count(WebFeature::kPrefixedCursorGrabbing);
+  }
+  CSSValue* cursor_type = nullptr;
+  if (id == CSSValueID::kHand) {
+    if (!in_quirks_mode)  // Non-standard behavior
+      return nullptr;
+    cursor_type = CSSIdentifierValue::Create(CSSValueID::kPointer);
+    range.ConsumeIncludingWhitespace();
+  } else if ((id >= CSSValueID::kAuto && id <= CSSValueID::kWebkitZoomOut) ||
+             id == CSSValueID::kCopy || id == CSSValueID::kNone) {
+    cursor_type = css_property_parser_helpers::ConsumeIdent(range);
+  } else {
+    return nullptr;
+  }
+
+  if (!list)
+    return cursor_type;
+  list->Append(*cursor_type);
+  return list;
+}
+
+const CSSValue* Cursor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = nullptr;
+  CursorList* cursors = style.Cursors();
+  if (cursors && cursors->size() > 0) {
+    list = CSSValueList::CreateCommaSeparated();
+    for (const CursorData& cursor : *cursors) {
+      if (StyleImage* image = cursor.GetImage()) {
+        list->Append(*MakeGarbageCollected<cssvalue::CSSCursorImageValue>(
+            *image->ComputedCSSValue(), cursor.HotSpotSpecified(),
+            cursor.HotSpot()));
+      }
+    }
+  }
+  CSSValue* value = CSSIdentifierValue::Create(style.Cursor());
+  if (list) {
+    list->Append(*value);
+    return list;
+  }
+  return value;
+}
+
+void Cursor::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->ClearCursorList();
+  state.Style()->SetCursor(ComputedStyleInitialValues::InitialCursor());
+}
+
+void Cursor::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetCursor(state.ParentStyle()->Cursor());
+  state.Style()->SetCursorList(state.ParentStyle()->Cursors());
+}
+
+void Cursor::ApplyValue(StyleResolverState& state,
+                        const CSSValue& value) const {
+  state.Style()->ClearCursorList();
+  if (auto* value_list = DynamicTo<CSSValueList>(value)) {
+    state.Style()->SetCursor(ECursor::kAuto);
+    for (const auto& item : *value_list) {
+      if (const auto* cursor =
+              DynamicTo<cssvalue::CSSCursorImageValue>(*item)) {
+        const CSSValue& image = cursor->ImageValue();
+        state.Style()->AddCursor(
+            state.GetStyleImage(CSSPropertyID::kCursor, image),
+            cursor->HotSpotSpecified(), cursor->HotSpot());
+      } else {
+        state.Style()->SetCursor(
+            To<CSSIdentifierValue>(*item).ConvertTo<ECursor>());
+      }
+    }
+  } else {
+    state.Style()->SetCursor(
+        To<CSSIdentifierValue>(value).ConvertTo<ECursor>());
+  }
+}
+
+const CSSValue* Cx::ParseSingleValue(CSSParserTokenRange& range,
+                                     const CSSParserContext& context,
+                                     const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeAll);
+}
+
+const CSSValue* Cx::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Cx(),
+                                                             style);
+}
+
+const CSSValue* Cy::ParseSingleValue(CSSParserTokenRange& range,
+                                     const CSSParserContext& context,
+                                     const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeAll);
+}
+
+const CSSValue* Cy::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Cy(),
+                                                             style);
+}
+
+const CSSValue* D::ParseSingleValue(CSSParserTokenRange& range,
+                                    const CSSParserContext&,
+                                    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumePathOrNone(range);
+}
+
+const CSSValue* D::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (const StylePath* style_path = svg_style.D())
+    return style_path->ComputedCSSValue();
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* Direction::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Direction());
+}
+
+void Direction::ApplyValue(StyleResolverState& state,
+                           const CSSValue& value) const {
+  state.Style()->SetDirection(
+      To<CSSIdentifierValue>(value).ConvertTo<TextDirection>());
+}
+
+const CSSValue* Display::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  // NOTE: All the keyword values for the display property are handled by the
+  // CSSParserFastPaths.
+  if (!RuntimeEnabledFeatures::CSSLayoutAPIEnabled())
+    return nullptr;
+
+  if (!context.IsSecureContext())
+    return nullptr;
+
+  CSSValueID function = range.Peek().FunctionId();
+  if (function != CSSValueID::kLayout && function != CSSValueID::kInlineLayout)
+    return nullptr;
+
+  CSSParserTokenRange range_copy = range;
+  CSSParserTokenRange args =
+      css_property_parser_helpers::ConsumeFunction(range_copy);
+  CSSCustomIdentValue* name =
+      css_property_parser_helpers::ConsumeCustomIdent(args, context);
+
+  // If we didn't get a custom-ident or didn't exhaust the function arguments
+  // return nothing.
+  if (!name || !args.AtEnd())
+    return nullptr;
+
+  range = range_copy;
+  return MakeGarbageCollected<cssvalue::CSSLayoutFunctionValue>(
+      name, /* is_inline */ function == CSSValueID::kInlineLayout);
+}
+
+const CSSValue* Display::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  if (style.IsDisplayLayoutCustomBox()) {
+    return MakeGarbageCollected<cssvalue::CSSLayoutFunctionValue>(
+        MakeGarbageCollected<CSSCustomIdentValue>(
+            style.DisplayLayoutCustomName()),
+        style.IsDisplayInlineType());
+  }
+
+  return CSSIdentifierValue::Create(style.Display());
+}
+
+void Display::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetDisplay(ComputedStyleInitialValues::InitialDisplay());
+  state.Style()->SetDisplayLayoutCustomName(
+      ComputedStyleInitialValues::InitialDisplayLayoutCustomName());
+}
+
+void Display::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetDisplay(state.ParentStyle()->Display());
+  state.Style()->SetDisplayLayoutCustomName(
+      state.ParentStyle()->DisplayLayoutCustomName());
+}
+
+void Display::ApplyValue(StyleResolverState& state,
+                         const CSSValue& value) const {
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    state.Style()->SetDisplay(identifier_value->ConvertTo<EDisplay>());
+    state.Style()->SetDisplayLayoutCustomName(
+        ComputedStyleInitialValues::InitialDisplayLayoutCustomName());
+    return;
+  }
+
+  const auto& layout_function_value =
+      To<cssvalue::CSSLayoutFunctionValue>(value);
+
+  EDisplay display = layout_function_value.IsInline()
+                         ? EDisplay::kInlineLayoutCustom
+                         : EDisplay::kLayoutCustom;
+  state.Style()->SetDisplay(display);
+  state.Style()->SetDisplayLayoutCustomName(layout_function_value.GetName());
+}
+
+const CSSValue* DominantBaseline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.DominantBaseline());
+}
+
+const CSSValue* EmptyCells::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.EmptyCells());
+}
+
+const CSSValue* Fill::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParsePaintStroke(range, context);
+}
+
+const CSSValue* Fill::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::AdjustSVGPaintForCurrentColor(
+      svg_style.FillPaint(), style.GetColor());
+}
+
+const CSSValue* FillOpacity::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* FillOpacity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(svg_style.FillOpacity(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* FillRule::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.FillRule());
+}
+
+const CSSValue* Filter::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeFilterFunctionList(range, context);
+}
+
+const CSSValue* Filter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFilter(style, style.Filter());
+}
+
+const CSSValue* FlexBasis::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // FIXME: Support intrinsic dimensions too.
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative);
+}
+
+const CSSValue* FlexBasis::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.FlexBasis(),
+                                                             style);
+}
+
+const CSSValue* FlexDirection::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.FlexDirection());
+}
+
+const CSSValue* FlexGrow::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext&,
+                                           const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range,
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* FlexGrow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.FlexGrow(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* FlexShrink::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range,
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* FlexShrink::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.FlexShrink(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* FlexWrap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.FlexWrap());
+}
+
+const CSSValue* Float::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasOutOfFlowPosition())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return CSSIdentifierValue::Create(style.Floating());
+}
+
+const CSSValue* FloodColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color FloodColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = style.FloodColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* FloodColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(style,
+                                                      style.FloodColor());
+}
+
+const CSSValue* FloodOpacity::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* FloodOpacity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(svg_style.FloodOpacity(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* FontFamily::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontFamily(range);
+}
+
+const CSSValue* FontFamily::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontFamily(style);
+}
+
+const CSSValue* FontFeatureSettings::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontFeatureSettings(range);
+}
+
+const CSSValue* FontFeatureSettings::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const blink::FontFeatureSettings* feature_settings =
+      style.GetFontDescription().FeatureSettings();
+  if (!feature_settings || !feature_settings->size())
+    return CSSIdentifierValue::Create(CSSValueID::kNormal);
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  for (wtf_size_t i = 0; i < feature_settings->size(); ++i) {
+    const FontFeature& feature = feature_settings->at(i);
+    auto* feature_value = MakeGarbageCollected<cssvalue::CSSFontFeatureValue>(
+        feature.Tag(), feature.Value());
+    list->Append(*feature_value);
+  }
+  return list;
+}
+
+const CSSValue* FontKerning::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetFontDescription().GetKerning());
+}
+
+const CSSValue* FontSizeAdjust::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  DCHECK(RuntimeEnabledFeatures::CSSFontSizeAdjustEnabled());
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeNumber(range,
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* FontSizeAdjust::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasFontSizeAdjust()) {
+    return CSSPrimitiveValue::Create(style.FontSizeAdjust(),
+                                     CSSPrimitiveValue::UnitType::kNumber);
+  }
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* FontSize::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext& context,
+                                           const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontSize(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* FontSize::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontSize(style);
+}
+
+const CSSValue* FontStretch::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontStretch(range, context.Mode());
+}
+
+const CSSValue* FontStretch::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontStretch(style);
+}
+
+const CSSValue* FontStyle::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontStyle(range, context.Mode());
+}
+
+const CSSValue* FontStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontStyle(style);
+}
+
+const CSSValue* FontVariantCaps::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kNormal, CSSValueID::kSmallCaps, CSSValueID::kAllSmallCaps,
+      CSSValueID::kPetiteCaps, CSSValueID::kAllPetiteCaps, CSSValueID::kUnicase,
+      CSSValueID::kTitlingCaps>(range);
+}
+
+const CSSValue* FontVariantCaps::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontVariantCaps(style);
+}
+
+const CSSValue* FontVariantEastAsian::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNormal)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  FontVariantEastAsianParser east_asian_parser;
+  do {
+    if (east_asian_parser.ConsumeEastAsian(range) !=
+        FontVariantEastAsianParser::ParseResult::kConsumedValue)
+      return nullptr;
+  } while (!range.AtEnd());
+
+  return east_asian_parser.FinalizeValue();
+}
+
+const CSSValue* FontVariantEastAsian::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontVariantEastAsian(style);
+}
+
+const CSSValue* FontVariantLigatures::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNormal ||
+      range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  FontVariantLigaturesParser ligatures_parser;
+  do {
+    if (ligatures_parser.ConsumeLigature(range) !=
+        FontVariantLigaturesParser::ParseResult::kConsumedValue)
+      return nullptr;
+  } while (!range.AtEnd());
+
+  return ligatures_parser.FinalizeValue();
+}
+
+const CSSValue* FontVariantLigatures::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontVariantLigatures(style);
+}
+
+const CSSValue* FontVariantNumeric::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNormal)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  FontVariantNumericParser numeric_parser;
+  do {
+    if (numeric_parser.ConsumeNumeric(range) !=
+        FontVariantNumericParser::ParseResult::kConsumedValue)
+      return nullptr;
+  } while (!range.AtEnd());
+
+  return numeric_parser.FinalizeValue();
+}
+
+const CSSValue* FontVariantNumeric::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontVariantNumeric(style);
+}
+
+namespace {
+
+cssvalue::CSSFontVariationValue* ConsumeFontVariationTag(
+    CSSParserTokenRange& range) {
+  // Feature tag name consists of 4-letter characters.
+  static const wtf_size_t kTagNameLength = 4;
+
+  const CSSParserToken& token = range.ConsumeIncludingWhitespace();
+  // Feature tag name comes first
+  if (token.GetType() != kStringToken)
+    return nullptr;
+  if (token.Value().length() != kTagNameLength)
+    return nullptr;
+  AtomicString tag = token.Value().ToAtomicString();
+  for (wtf_size_t i = 0; i < kTagNameLength; ++i) {
+    // Limits the range of characters to 0x20-0x7E, following the tag name rules
+    // defined in the OpenType specification.
+    UChar character = tag[i];
+    if (character < 0x20 || character > 0x7E)
+      return nullptr;
+  }
+
+  double tag_value = 0;
+  if (!css_property_parser_helpers::ConsumeNumberRaw(range, tag_value))
+    return nullptr;
+  return MakeGarbageCollected<cssvalue::CSSFontVariationValue>(
+      tag, clampTo<float>(tag_value));
+}
+
+}  // namespace
+
+const CSSValue* FontVariationSettings::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNormal)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  CSSValueList* variation_settings = CSSValueList::CreateCommaSeparated();
+  do {
+    cssvalue::CSSFontVariationValue* font_variation_value =
+        ConsumeFontVariationTag(range);
+    if (!font_variation_value)
+      return nullptr;
+    variation_settings->Append(*font_variation_value);
+  } while (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range));
+  return variation_settings;
+}
+
+const CSSValue* FontVariationSettings::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const blink::FontVariationSettings* variation_settings =
+      style.GetFontDescription().VariationSettings();
+  if (!variation_settings || !variation_settings->size())
+    return CSSIdentifierValue::Create(CSSValueID::kNormal);
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  for (wtf_size_t i = 0; i < variation_settings->size(); ++i) {
+    const FontVariationAxis& variation_axis = variation_settings->at(i);
+    cssvalue::CSSFontVariationValue* variation_value =
+        MakeGarbageCollected<cssvalue::CSSFontVariationValue>(
+            variation_axis.Tag(), variation_axis.Value());
+    list->Append(*variation_value);
+  }
+  return list;
+}
+
+const CSSValue* FontWeight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeFontWeight(range, context.Mode());
+}
+
+const CSSValue* FontWeight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFontWeight(style);
+}
+
+const CSSValue* GridAutoColumns::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridTrackList(
+      range, context, context.Mode(),
+      css_parsing_utils::TrackListType::kGridAuto);
+}
+
+// Specs mention that getComputedStyle() should return the used value of the
+// property instead of the computed one for grid-template-{rows|columns} but
+// not for the grid-auto-{rows|columns} as things like grid-auto-columns:
+// 2fr; cannot be resolved to a value in pixels as the '2fr' means very
+// different things depending on the size of the explicit grid or the number
+// of implicit tracks added to the grid. See
+// http://lists.w3.org/Archives/Public/www-style/2013Nov/0014.html
+const CSSValue* GridAutoColumns::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridTrackSizeList(kForColumns, style);
+}
+
+const CSSValue* GridAutoFlow::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSIdentifierValue* row_or_column_value =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kRow,
+                                                CSSValueID::kColumn>(range);
+  CSSIdentifierValue* dense_algorithm =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
+  if (!row_or_column_value) {
+    row_or_column_value =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kRow,
+                                                  CSSValueID::kColumn>(range);
+    if (!row_or_column_value && !dense_algorithm)
+      return nullptr;
+  }
+  CSSValueList* parsed_values = CSSValueList::CreateSpaceSeparated();
+  if (row_or_column_value)
+    parsed_values->Append(*row_or_column_value);
+  if (dense_algorithm)
+    parsed_values->Append(*dense_algorithm);
+  return parsed_values;
+}
+
+const CSSValue* GridAutoFlow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  switch (style.GetGridAutoFlow()) {
+    case kAutoFlowRow:
+    case kAutoFlowRowDense:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRow));
+      break;
+    case kAutoFlowColumn:
+    case kAutoFlowColumnDense:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kColumn));
+      break;
+    default:
+      NOTREACHED();
+  }
+
+  switch (style.GetGridAutoFlow()) {
+    case kAutoFlowRowDense:
+    case kAutoFlowColumnDense:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kDense));
+      break;
+    default:
+      // Do nothing.
+      break;
+  }
+
+  return list;
+}
+
+const CSSValue* GridAutoRows::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridTrackList(
+      range, context, context.Mode(),
+      css_parsing_utils::TrackListType::kGridAuto);
+}
+
+const CSSValue* GridAutoRows::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridTrackSizeList(kForRows, style);
+}
+
+const CSSValue* GridColumnEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridLine(range, context);
+}
+
+const CSSValue* GridColumnEnd::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridPosition(style.GridColumnEnd());
+}
+
+const CSSValue* GridColumnStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridLine(range, context);
+}
+
+const CSSValue* GridColumnStart::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridPosition(style.GridColumnStart());
+}
+
+const CSSValue* GridRowEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridLine(range, context);
+}
+
+const CSSValue* GridRowEnd::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridPosition(style.GridRowEnd());
+}
+
+const CSSValue* GridRowStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridLine(range, context);
+}
+
+const CSSValue* GridRowStart::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridPosition(style.GridRowStart());
+}
+
+const CSSValue* GridTemplateAreas::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  NamedGridAreaMap grid_area_map;
+  size_t row_count = 0;
+  size_t column_count = 0;
+
+  while (range.Peek().GetType() == kStringToken) {
+    if (!css_parsing_utils::ParseGridTemplateAreasRow(
+            range.ConsumeIncludingWhitespace().Value().ToString(),
+            grid_area_map, row_count, column_count))
+      return nullptr;
+    ++row_count;
+  }
+
+  if (row_count == 0)
+    return nullptr;
+  DCHECK(column_count);
+  return MakeGarbageCollected<cssvalue::CSSGridTemplateAreasValue>(
+      grid_area_map, row_count, column_count);
+}
+
+const CSSValue* GridTemplateAreas::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.NamedGridAreaRowCount()) {
+    DCHECK(!style.NamedGridAreaColumnCount());
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  }
+
+  return MakeGarbageCollected<cssvalue::CSSGridTemplateAreasValue>(
+      style.NamedGridArea(), style.NamedGridAreaRowCount(),
+      style.NamedGridAreaColumnCount());
+}
+
+void GridTemplateAreas::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetNamedGridArea(
+      ComputedStyleInitialValues::InitialNamedGridArea());
+  state.Style()->SetNamedGridAreaRowCount(
+      ComputedStyleInitialValues::InitialNamedGridAreaRowCount());
+  state.Style()->SetNamedGridAreaColumnCount(
+      ComputedStyleInitialValues::InitialNamedGridAreaColumnCount());
+}
+
+void GridTemplateAreas::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetNamedGridArea(state.ParentStyle()->NamedGridArea());
+  state.Style()->SetNamedGridAreaRowCount(
+      state.ParentStyle()->NamedGridAreaRowCount());
+  state.Style()->SetNamedGridAreaColumnCount(
+      state.ParentStyle()->NamedGridAreaColumnCount());
+}
+
+void GridTemplateAreas::ApplyValue(StyleResolverState& state,
+                                   const CSSValue& value) const {
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    // FIXME: Shouldn't we clear the grid-area values
+    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kNone);
+    return;
+  }
+
+  const auto& grid_template_areas_value =
+      To<cssvalue::CSSGridTemplateAreasValue>(value);
+  const NamedGridAreaMap& new_named_grid_areas =
+      grid_template_areas_value.GridAreaMap();
+
+  NamedGridLinesMap named_grid_column_lines;
+  NamedGridLinesMap named_grid_row_lines;
+  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
+      state.Style()->OrderedNamedGridColumnLines(), named_grid_column_lines);
+  StyleBuilderConverter::ConvertOrderedNamedGridLinesMapToNamedGridLinesMap(
+      state.Style()->OrderedNamedGridRowLines(), named_grid_row_lines);
+  StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
+      new_named_grid_areas, named_grid_column_lines, kForColumns);
+  StyleBuilderConverter::CreateImplicitNamedGridLinesFromGridArea(
+      new_named_grid_areas, named_grid_row_lines, kForRows);
+  state.Style()->SetNamedGridColumnLines(named_grid_column_lines);
+  state.Style()->SetNamedGridRowLines(named_grid_row_lines);
+
+  state.Style()->SetNamedGridArea(new_named_grid_areas);
+  state.Style()->SetNamedGridAreaRowCount(grid_template_areas_value.RowCount());
+  state.Style()->SetNamedGridAreaColumnCount(
+      grid_template_areas_value.ColumnCount());
+}
+
+const CSSValue* GridTemplateColumns::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range, context,
+                                                              context.Mode());
+}
+
+bool GridTemplateColumns::IsLayoutDependent(const ComputedStyle* style,
+                                            LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsLayoutGrid();
+}
+
+const CSSValue* GridTemplateColumns::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridTrackList(kForColumns, layout_object,
+                                                   style);
+}
+
+const CSSValue* GridTemplateRows::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(range, context,
+                                                              context.Mode());
+}
+
+bool GridTemplateRows::IsLayoutDependent(const ComputedStyle* style,
+                                         LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsLayoutGrid();
+}
+
+const CSSValue* GridTemplateRows::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForGridTrackList(kForRows, layout_object,
+                                                   style);
+}
+
+const CSSValue* Height::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool Height::IsLayoutDependent(const ComputedStyle* style,
+                               LayoutObject* layout_object) const {
+  return layout_object && (layout_object->IsBox() || layout_object->IsSVG());
+}
+
+const CSSValue* Height::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (ComputedStyleUtils::WidthOrHeightShouldReturnUsedValue(layout_object)) {
+    return ZoomAdjustedPixelValue(
+        ComputedStyleUtils::UsedBoxSize(*layout_object).Height(), style);
+  }
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.Height(),
+                                                             style);
+}
+
+const CSSValue* Hyphens::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetHyphens());
+}
+
+const CSSValue* ImageOrientation::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  DCHECK(RuntimeEnabledFeatures::ImageOrientationEnabled());
+  if (range.Peek().Id() == CSSValueID::kFromImage)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  if (range.Peek().GetType() != kNumberToken) {
+    CSSPrimitiveValue* angle = css_property_parser_helpers::ConsumeAngle(
+        range, &context, base::Optional<WebFeature>());
+    if (angle && angle->GetDoubleValue() == 0)
+      return angle;
+  }
+  return nullptr;
+}
+
+const CSSValue* ImageOrientation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.RespectImageOrientation() == kRespectImageOrientation)
+    return CSSIdentifierValue::Create(CSSValueID::kFromImage);
+  return CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kDegrees);
+}
+
+const CSSValue* ImageRendering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.ImageRendering());
+}
+
+const CSSValue* InlineSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
+}
+
+bool InlineSize::IsLayoutDependent(const ComputedStyle* style,
+                                   LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* InsetBlockEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* InsetBlockStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* InsetInlineEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* InsetInlineStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* Isolation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Isolation());
+}
+
+const CSSValue* JustifyContent::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // justify-content property does not allow the <baseline-position> values.
+  if (css_property_parser_helpers::IdentMatches<
+          CSSValueID::kFirst, CSSValueID::kLast, CSSValueID::kBaseline>(
+          range.Peek().Id()))
+    return nullptr;
+  return css_parsing_utils::ConsumeContentDistributionOverflowPosition(
+      range, css_parsing_utils::IsContentPositionOrLeftOrRightKeyword);
+}
+
+const CSSValue* JustifyContent::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::
+      ValueForContentPositionAndDistributionWithOverflowAlignment(
+          style.JustifyContent());
+}
+
+const CSSValue* JustifyItems::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSParserTokenRange range_copy = range;
+  // justify-items property does not allow the 'auto' value.
+  if (css_property_parser_helpers::IdentMatches<CSSValueID::kAuto>(
+          range.Peek().Id()))
+    return nullptr;
+  CSSIdentifierValue* legacy =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kLegacy>(
+          range_copy);
+  CSSIdentifierValue* position_keyword =
+      css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kCenter, CSSValueID::kLeft, CSSValueID::kRight>(
+          range_copy);
+  if (!legacy) {
+    legacy = css_property_parser_helpers::ConsumeIdent<CSSValueID::kLegacy>(
+        range_copy);
+  }
+  if (legacy) {
+    range = range_copy;
+    if (position_keyword) {
+      context.Count(WebFeature::kCSSLegacyAlignment);
+      return MakeGarbageCollected<CSSValuePair>(
+          legacy, position_keyword, CSSValuePair::kDropIdenticalValues);
+    }
+    return legacy;
+  }
+
+  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
+      range, css_parsing_utils::IsSelfPositionOrLeftOrRightKeyword);
+}
+
+const CSSValue* JustifyItems::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
+      style.JustifyItems().GetPosition() == ItemPosition::kAuto
+          ? ComputedStyleInitialValues::InitialDefaultAlignment()
+          : style.JustifyItems());
+}
+
+const CSSValue* JustifySelf::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeSelfPositionOverflowPosition(
+      range, css_parsing_utils::IsSelfPositionOrLeftOrRightKeyword);
+}
+
+const CSSValue* JustifySelf::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForItemPositionWithOverflowAlignment(
+      style.JustifySelf());
+}
+
+const CSSValue* Left::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_parsing_utils::UnitlessUnlessShorthand(local_context));
+}
+
+bool Left::IsLayoutDependent(const ComputedStyle* style,
+                             LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* Left::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
+                                                    layout_object);
+}
+
+const CSSValue* LetterSpacing::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseSpacing(range, context);
+}
+
+const CSSValue* LetterSpacing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.LetterSpacing())
+    return CSSIdentifierValue::Create(CSSValueID::kNormal);
+  return ZoomAdjustedPixelValue(style.LetterSpacing(), style);
+}
+
+const CSSValue* LightingColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color LightingColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = style.LightingColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* LightingColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(style,
+                                                      style.LightingColor());
+}
+
+const CSSValue* LineBreak::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetLineBreak());
+}
+
+const CSSValue* LineHeight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeLineHeight(range, context.Mode());
+}
+
+const CSSValue* LineHeight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForLineHeight(style);
+}
+
+const CSSValue* LineHeightStep::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* LineHeightStep::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.LineHeightStep(), style);
+}
+
+const CSSValue* ListStyleImage::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
+}
+
+const CSSValue* ListStyleImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.ListStyleImage())
+    return style.ListStyleImage()->ComputedCSSValue();
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+void ListStyleImage::ApplyValue(StyleResolverState& state,
+                                const CSSValue& value) const {
+  state.Style()->SetListStyleImage(
+      state.GetStyleImage(CSSPropertyID::kListStyleImage, value));
+}
+
+const CSSValue* ListStylePosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.ListStylePosition());
+}
+
+const CSSValue* ListStyleType::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.ListStyleType());
+}
+
+const CSSValue* MarginBlockEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* MarginBlockStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* MarginBottom::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool MarginBottom::IsLayoutDependent(const ComputedStyle* style,
+                                     LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->MarginBottom().IsFixed());
+}
+
+const CSSValue* MarginBottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& margin_bottom = style.MarginBottom();
+  if (margin_bottom.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_bottom,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginBottom(),
+                                style);
+}
+
+const CSSValue* MarginInlineEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* MarginInlineStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* MarginLeft::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool MarginLeft::IsLayoutDependent(const ComputedStyle* style,
+                                   LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->MarginLeft().IsFixed());
+}
+
+const CSSValue* MarginLeft::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& margin_left = style.MarginLeft();
+  if (margin_left.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_left,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginLeft(),
+                                style);
+}
+
+const CSSValue* MarginRight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool MarginRight::IsLayoutDependent(const ComputedStyle* style,
+                                    LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->MarginRight().IsFixed());
+}
+
+const CSSValue* MarginRight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& margin_right = style.MarginRight();
+  if (margin_right.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_right,
+                                                               style);
+  }
+  float value;
+  if (margin_right.IsPercentOrCalc()) {
+    // LayoutBox gives a marginRight() that is the distance between the
+    // right-edge of the child box and the right-edge of the containing box,
+    // when display == EDisplay::kBlock. Let's calculate the absolute value
+    // of the specified margin-right % instead of relying on LayoutBox's
+    // marginRight() value.
+    value =
+        MinimumValueForLength(
+            margin_right,
+            ToLayoutBox(layout_object)->ContainingBlockLogicalWidthForContent())
+            .ToFloat();
+  } else {
+    value = ToLayoutBox(layout_object)->MarginRight().ToFloat();
+  }
+  return ZoomAdjustedPixelValue(value, style);
+}
+
+const CSSValue* MarginTop::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool MarginTop::IsLayoutDependent(const ComputedStyle* style,
+                                  LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->MarginTop().IsFixed());
+}
+
+const CSSValue* MarginTop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& margin_top = style.MarginTop();
+  if (margin_top.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_top,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginTop(), style);
+}
+
+const CSSValue* MarkerEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeUrl(range, &context);
+}
+
+const CSSValue* MarkerEnd::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForSVGResource(svg_style.MarkerEndResource());
+}
+
+const CSSValue* MarkerMid::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeUrl(range, &context);
+}
+
+const CSSValue* MarkerMid::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForSVGResource(svg_style.MarkerMidResource());
+}
+
+const CSSValue* MarkerStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeUrl(range, &context);
+}
+
+const CSSValue* MarkerStart::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForSVGResource(
+      svg_style.MarkerStartResource());
+}
+
+const CSSValue* Mask::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeUrl(range, &context);
+}
+
+const CSSValue* Mask::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForSVGResource(svg_style.MaskerResource());
+}
+
+const CSSValue* MaskSourceType::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeMaskSourceType, range);
+}
+
+static CSSValue* ValueForFillSourceType(EMaskSourceType type) {
+  switch (type) {
+    case EMaskSourceType::kAlpha:
+      return CSSIdentifierValue::Create(CSSValueID::kAlpha);
+    case EMaskSourceType::kLuminance:
+      return CSSIdentifierValue::Create(CSSValueID::kLuminance);
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+const CSSValue* MaskSourceType::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  for (const FillLayer* curr_layer = &style.MaskLayers(); curr_layer;
+       curr_layer = curr_layer->Next())
+    list->Append(*ValueForFillSourceType(curr_layer->MaskSourceType()));
+  return list;
+}
+
+const CSSValue* MaskType::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.MaskType());
+}
+
+const CSSValue* MaxBlockSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMaxWidthOrHeight(range, context);
+}
+
+const CSSValue* MaxHeight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMaxWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* MaxHeight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& max_height = style.MaxHeight();
+  if (max_height.IsMaxSizeNone())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(max_height, style);
+}
+
+const CSSValue* MaxInlineSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMaxWidthOrHeight(range, context);
+}
+
+const CSSValue* MaxWidth::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext& context,
+                                           const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeMaxWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* MaxWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& max_width = style.MaxWidth();
+  if (max_width.IsMaxSizeNone())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(max_width, style);
+}
+
+const CSSValue* MinBlockSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
+}
+
+const CSSValue* MinHeight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* MinHeight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.MinHeight().IsAuto())
+    return ComputedStyleUtils::MinWidthOrMinHeightAuto(styled_node, style);
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.MinHeight(),
+                                                             style);
+}
+
+const CSSValue* MinInlineSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
+}
+
+const CSSValue* MinWidth::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext& context,
+                                           const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* MinWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.MinWidth().IsAuto())
+    return ComputedStyleUtils::MinWidthOrMinHeightAuto(styled_node, style);
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.MinWidth(),
+                                                             style);
+}
+
+const CSSValue* MixBlendMode::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetBlendMode());
+}
+
+const CSSValue* ObjectFit::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetObjectFit());
+}
+
+const CSSValue* ObjectPosition::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumePosition(range, context,
+                         css_property_parser_helpers::UnitlessQuirk::kForbid,
+                         base::Optional<WebFeature>());
+}
+
+const CSSValue* ObjectPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return MakeGarbageCollected<CSSValuePair>(
+      ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+          style.ObjectPosition().X(), style),
+      ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+          style.ObjectPosition().Y(), style),
+      CSSValuePair::kKeepIdenticalValues);
+}
+
+const CSSValue* OffsetAnchor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumePosition(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kForbid,
+      base::Optional<WebFeature>());
+}
+
+const CSSValue* OffsetAnchor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPosition(style.OffsetAnchor(), style);
+}
+
+const CSSValue* OffsetDistance::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeAll);
+}
+
+const CSSValue* OffsetDistance::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.OffsetDistance(), style);
+}
+
+const CSSValue* OffsetPath::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeOffsetPath(range, context);
+}
+
+const CSSValue* OffsetPath::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  if (const BasicShape* style_motion_path = style.OffsetPath())
+    return ValueForBasicShape(style, style_motion_path);
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* OffsetPosition::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  CSSValue* value = css_property_parser_helpers::ConsumePosition(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kForbid,
+      base::Optional<WebFeature>());
+
+  // Count when we receive a valid position other than 'auto'.
+  if (value && value->IsValuePair())
+    context.Count(WebFeature::kCSSOffsetInEffect);
+  return value;
+}
+
+const CSSValue* OffsetPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPosition(style.OffsetPosition(), style);
+}
+
+const CSSValue* OffsetRotate::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeOffsetRotate(range, context);
+}
+const CSSValue* OffsetRotate::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (style.OffsetRotate().type == OffsetRotationType::kAuto)
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kAuto));
+  list->Append(*CSSPrimitiveValue::Create(
+      style.OffsetRotate().angle, CSSPrimitiveValue::UnitType::kDegrees));
+  return list;
+}
+
+const CSSValue* Opacity::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* Opacity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.Opacity(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* Order::ParseSingleValue(CSSParserTokenRange& range,
+                                        const CSSParserContext& context,
+                                        const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeInteger(range);
+}
+
+const CSSValue* Order::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.Order(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* Orphans::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumePositiveInteger(range);
+}
+
+const CSSValue* Orphans::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.Orphans(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* OutlineColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // Allow the special focus color even in HTML Standard parsing mode.
+  if (range.Peek().Id() == CSSValueID::kWebkitFocusRingColor)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color OutlineColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result =
+      visited_link ? style.VisitedLinkOutlineColor() : style.OutlineColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* OutlineColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return allow_visited_style ? cssvalue::CSSColorValue::Create(
+                                   style.VisitedDependentColor(*this).Rgb())
+                             : ComputedStyleUtils::CurrentColorOrValidColor(
+                                   style, style.OutlineColor());
+}
+
+const CSSValue* OutlineOffset::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeAll);
+}
+
+const CSSValue* OutlineOffset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.OutlineOffset(), style);
+}
+
+const CSSValue* OutlineStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.OutlineStyleIsAuto())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return CSSIdentifierValue::Create(style.OutlineStyle());
+}
+
+void OutlineStyle::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetOutlineStyleIsAuto(
+      ComputedStyleInitialValues::InitialOutlineStyleIsAuto());
+  state.Style()->SetOutlineStyle(EBorderStyle::kNone);
+}
+
+void OutlineStyle::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetOutlineStyleIsAuto(
+      state.ParentStyle()->OutlineStyleIsAuto());
+  state.Style()->SetOutlineStyle(state.ParentStyle()->OutlineStyle());
+}
+
+void OutlineStyle::ApplyValue(StyleResolverState& state,
+                              const CSSValue& value) const {
+  const auto& identifier_value = To<CSSIdentifierValue>(value);
+  state.Style()->SetOutlineStyleIsAuto(
+      static_cast<bool>(identifier_value.ConvertTo<OutlineIsAuto>()));
+  state.Style()->SetOutlineStyle(identifier_value.ConvertTo<EBorderStyle>());
+}
+
+const CSSValue* OutlineWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLineWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* OutlineWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.OutlineWidth(), style);
+}
+
+const CSSValue* OverflowAnchor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverflowAnchor());
+}
+
+const CSSValue* OverflowWrap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverflowWrap());
+}
+
+const CSSValue* OverflowX::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverflowX());
+}
+
+const CSSValue* OverflowY::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverflowY());
+}
+
+const CSSValue* OverscrollBehaviorX::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverscrollBehaviorX());
+}
+
+const CSSValue* OverscrollBehaviorY::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.OverscrollBehaviorY());
+}
+
+const CSSValue* PaddingBlockEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* PaddingBlockStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* PaddingBottom::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool PaddingBottom::IsLayoutDependent(const ComputedStyle* style,
+                                      LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->PaddingBottom().IsFixed());
+}
+
+const CSSValue* PaddingBottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& padding_bottom = style.PaddingBottom();
+  if (padding_bottom.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_bottom,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(
+      ToLayoutBox(layout_object)->ComputedCSSPaddingBottom(), style);
+}
+
+const CSSValue* PaddingInlineEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* PaddingInlineStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* PaddingLeft::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool PaddingLeft::IsLayoutDependent(const ComputedStyle* style,
+                                    LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->PaddingLeft().IsFixed());
+}
+
+const CSSValue* PaddingLeft::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& padding_left = style.PaddingLeft();
+  if (padding_left.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_left,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(
+      ToLayoutBox(layout_object)->ComputedCSSPaddingLeft(), style);
+}
+
+const CSSValue* PaddingRight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool PaddingRight::IsLayoutDependent(const ComputedStyle* style,
+                                     LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->PaddingRight().IsFixed());
+}
+
+const CSSValue* PaddingRight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& padding_right = style.PaddingRight();
+  if (padding_right.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_right,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(
+      ToLayoutBox(layout_object)->ComputedCSSPaddingRight(), style);
+}
+
+const CSSValue* PaddingTop::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool PaddingTop::IsLayoutDependent(const ComputedStyle* style,
+                                   LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->PaddingTop().IsFixed());
+}
+
+const CSSValue* PaddingTop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& padding_top = style.PaddingTop();
+  if (padding_top.IsFixed() || !layout_object || !layout_object->IsBox()) {
+    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_top,
+                                                               style);
+  }
+  return ZoomAdjustedPixelValue(
+      ToLayoutBox(layout_object)->ComputedCSSPaddingTop(), style);
+}
+
+const CSSValue* Page::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeCustomIdent(range, context);
+}
+
+const CSSValue* PaintOrder::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNormal)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  Vector<CSSValueID, 3> paint_type_list;
+  CSSIdentifierValue* fill = nullptr;
+  CSSIdentifierValue* stroke = nullptr;
+  CSSIdentifierValue* markers = nullptr;
+  do {
+    CSSValueID id = range.Peek().Id();
+    if (id == CSSValueID::kFill && !fill)
+      fill = css_property_parser_helpers::ConsumeIdent(range);
+    else if (id == CSSValueID::kStroke && !stroke)
+      stroke = css_property_parser_helpers::ConsumeIdent(range);
+    else if (id == CSSValueID::kMarkers && !markers)
+      markers = css_property_parser_helpers::ConsumeIdent(range);
+    else
+      return nullptr;
+    paint_type_list.push_back(id);
+  } while (!range.AtEnd());
+
+  // After parsing we serialize the paint-order list. Since it is not possible
+  // to pop a last list items from CSSValueList without bigger cost, we create
+  // the list after parsing.
+  CSSValueID first_paint_order_type = paint_type_list.at(0);
+  CSSValueList* paint_order_list = CSSValueList::CreateSpaceSeparated();
+  switch (first_paint_order_type) {
+    case CSSValueID::kFill:
+    case CSSValueID::kStroke:
+      paint_order_list->Append(
+          first_paint_order_type == CSSValueID::kFill ? *fill : *stroke);
+      if (paint_type_list.size() > 1) {
+        if (paint_type_list.at(1) == CSSValueID::kMarkers)
+          paint_order_list->Append(*markers);
+      }
+      break;
+    case CSSValueID::kMarkers:
+      paint_order_list->Append(*markers);
+      if (paint_type_list.size() > 1) {
+        if (paint_type_list.at(1) == CSSValueID::kStroke)
+          paint_order_list->Append(*stroke);
+      }
+      break;
+    default:
+      NOTREACHED();
+  }
+
+  return paint_order_list;
+}
+
+const CSSValue* PaintOrder::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const EPaintOrder paint_order = svg_style.PaintOrder();
+  if (paint_order == kPaintOrderNormal)
+    return CSSIdentifierValue::Create(CSSValueID::kNormal);
+
+  // Table mapping to the shortest (canonical) form of the property.
+  //
+  // Per spec, if any keyword is omitted it will be added last using
+  // the standard ordering. So "stroke" implies an order "stroke fill
+  // markers" etc. From a serialization PoV this means we never need
+  // to emit the last keyword.
+  //
+  // https://svgwg.org/svg2-draft/painting.html#PaintOrder
+  static const uint8_t canonical_form[][2] = {
+      // kPaintOrderNormal is handled above.
+      {PT_FILL, PT_NONE},       // kPaintOrderFillStrokeMarkers
+      {PT_FILL, PT_MARKERS},    // kPaintOrderFillMarkersStroke
+      {PT_STROKE, PT_NONE},     // kPaintOrderStrokeFillMarkers
+      {PT_STROKE, PT_MARKERS},  // kPaintOrderStrokeMarkersFill
+      {PT_MARKERS, PT_NONE},    // kPaintOrderMarkersFillStroke
+      {PT_MARKERS, PT_STROKE},  // kPaintOrderMarkersStrokeFill
+  };
+  DCHECK_LT(static_cast<size_t>(paint_order) - 1, base::size(canonical_form));
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  for (const auto& keyword : canonical_form[paint_order - 1]) {
+    const auto paint_order_type = static_cast<EPaintOrderType>(keyword);
+    if (paint_order_type == PT_NONE)
+      break;
+    list->Append(*CSSIdentifierValue::Create(paint_order_type));
+  }
+  return list;
+}
+
+const CSSValue* Perspective::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& localContext) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  CSSPrimitiveValue* parsed_value = css_property_parser_helpers::ConsumeLength(
+      range, context.Mode(), kValueRangeAll);
+  bool use_legacy_parsing = localContext.UseAliasParsing();
+  if (!parsed_value && use_legacy_parsing) {
+    double perspective;
+    if (!css_property_parser_helpers::ConsumeNumberRaw(range, perspective))
+      return nullptr;
+    context.Count(WebFeature::kUnitlessPerspectiveInPerspectiveProperty);
+    parsed_value = CSSPrimitiveValue::Create(
+        perspective, CSSPrimitiveValue::UnitType::kPixels);
+  }
+  if (parsed_value &&
+      (parsed_value->IsCalculated() || parsed_value->GetDoubleValue() > 0))
+    return parsed_value;
+  return nullptr;
+}
+
+const CSSValue* Perspective::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.HasPerspective())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return ZoomAdjustedPixelValue(style.Perspective(), style);
+}
+
+const CSSValue* PerspectiveOrigin::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumePosition(range, context,
+                         css_property_parser_helpers::UnitlessQuirk::kForbid,
+                         base::Optional<WebFeature>());
+}
+
+bool PerspectiveOrigin::IsLayoutDependent(const ComputedStyle* style,
+                                          LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* PerspectiveOrigin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (layout_object) {
+    LayoutRect box;
+    if (layout_object->IsBox())
+      box = ToLayoutBox(layout_object)->BorderBoxRect();
+
+    return MakeGarbageCollected<CSSValuePair>(
+        ZoomAdjustedPixelValue(
+            MinimumValueForLength(style.PerspectiveOriginX(), box.Width()),
+            style),
+        ZoomAdjustedPixelValue(
+            MinimumValueForLength(style.PerspectiveOriginY(), box.Height()),
+            style),
+        CSSValuePair::kKeepIdenticalValues);
+  } else {
+    return MakeGarbageCollected<CSSValuePair>(
+        ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+            style.PerspectiveOriginX(), style),
+        ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+            style.PerspectiveOriginY(), style),
+        CSSValuePair::kKeepIdenticalValues);
+  }
+}
+
+const CSSValue* PointerEvents::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.PointerEvents());
+}
+
+const CSSValue* Position::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetPosition());
+}
+
+void Position::ApplyInherit(StyleResolverState& state) const {
+  if (!state.ParentNode()->IsDocumentNode())
+    state.Style()->SetPosition(state.ParentStyle()->GetPosition());
+}
+
+const CSSValue* Quotes::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  CSSValueList* values = CSSValueList::CreateSpaceSeparated();
+  while (!range.AtEnd()) {
+    CSSStringValue* parsed_value =
+        css_property_parser_helpers::ConsumeString(range);
+    if (!parsed_value)
+      return nullptr;
+    values->Append(*parsed_value);
+  }
+  if (values->length() && values->length() % 2 == 0)
+    return values;
+  return nullptr;
+}
+
+const CSSValue* Quotes::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.Quotes()) {
+    // TODO(ramya.v): We should return the quote values that we're actually
+    // using.
+    return nullptr;
+  }
+  if (style.Quotes()->size()) {
+    CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+    for (int i = 0; i < style.Quotes()->size(); i++) {
+      list->Append(*MakeGarbageCollected<CSSStringValue>(
+          style.Quotes()->GetOpenQuote(i)));
+      list->Append(*MakeGarbageCollected<CSSStringValue>(
+          style.Quotes()->GetCloseQuote(i)));
+    }
+    return list;
+  }
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+const CSSValue* R::ParseSingleValue(CSSParserTokenRange& range,
+                                    const CSSParserContext& context,
+                                    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeNonNegative);
+}
+
+const CSSValue* R::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.R(),
+                                                             style);
+}
+
+const CSSValue* Resize::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Resize());
+}
+
+void Resize::ApplyValue(StyleResolverState& state,
+                        const CSSValue& value) const {
+  const CSSIdentifierValue& identifier_value = To<CSSIdentifierValue>(value);
+
+  EResize r = EResize::kNone;
+  if (identifier_value.GetValueID() == CSSValueID::kAuto) {
+    if (Settings* settings = state.GetDocument().GetSettings()) {
+      r = settings->GetTextAreasAreResizable() ? EResize::kBoth
+                                               : EResize::kNone;
+    }
+    UseCounter::Count(state.GetDocument(), WebFeature::kCSSResizeAuto);
+  } else {
+    r = identifier_value.ConvertTo<EResize>();
+  }
+  state.Style()->SetResize(r);
+}
+
+const CSSValue* Right::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_parsing_utils::UnitlessUnlessShorthand(local_context));
+}
+
+bool Right::IsLayoutDependent(const ComputedStyle* style,
+                              LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* Right::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
+                                                    layout_object);
+}
+
+const CSSValue* Rotate::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
+
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+
+  CSSValue* rotation = css_property_parser_helpers::ConsumeAngle(
+      range, &context, base::Optional<WebFeature>());
+
+  CSSValue* axis = css_property_parser_helpers::ConsumeAxis(range);
+  if (axis)
+    list->Append(*axis);
+  else if (!rotation)
+    return nullptr;
+
+  if (!rotation) {
+    rotation = css_property_parser_helpers::ConsumeAngle(
+        range, &context, base::Optional<WebFeature>());
+    if (!rotation)
+      return nullptr;
+  }
+  list->Append(*rotation);
+
+  return list;
+}
+
+const CSSValue* Rotate::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.Rotate())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (style.Rotate()->X() != 0 || style.Rotate()->Y() != 0 ||
+      style.Rotate()->Z() != 1) {
+    list->Append(*CSSPrimitiveValue::Create(
+        style.Rotate()->X(), CSSPrimitiveValue::UnitType::kNumber));
+    list->Append(*CSSPrimitiveValue::Create(
+        style.Rotate()->Y(), CSSPrimitiveValue::UnitType::kNumber));
+    list->Append(*CSSPrimitiveValue::Create(
+        style.Rotate()->Z(), CSSPrimitiveValue::UnitType::kNumber));
+  }
+  list->Append(*CSSPrimitiveValue::Create(
+      style.Rotate()->Angle(), CSSPrimitiveValue::UnitType::kDegrees));
+  return list;
+}
+
+const CSSValue* RowGap::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeGapLength(range, context);
+}
+
+const CSSValue* RowGap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool) const {
+  return ComputedStyleUtils::ValueForGapLength(style.RowGap(), style);
+}
+
+const CSSValue* Rx::ParseSingleValue(CSSParserTokenRange& range,
+                                     const CSSParserContext& context,
+                                     const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeNonNegative);
+}
+
+const CSSValue* Rx::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Rx(),
+                                                             style);
+}
+
+const CSSValue* Ry::ParseSingleValue(CSSParserTokenRange& range,
+                                     const CSSParserContext& context,
+                                     const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeNonNegative);
+}
+
+const CSSValue* Ry::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Ry(),
+                                                             style);
+}
+
+const CSSValue* Scale::ParseSingleValue(CSSParserTokenRange& range,
+                                        const CSSParserContext& context,
+                                        const CSSParserLocalContext&) const {
+  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
+
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValue* scale =
+      css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+  if (!scale)
+    return nullptr;
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*scale);
+  scale = css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+  if (scale) {
+    list->Append(*scale);
+    scale = css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+    if (scale)
+      list->Append(*scale);
+  }
+
+  return list;
+}
+
+const CSSValue* Scale::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.Scale())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*CSSPrimitiveValue::Create(
+      style.Scale()->X(), CSSPrimitiveValue::UnitType::kNumber));
+  list->Append(*CSSPrimitiveValue::Create(
+      style.Scale()->Y(), CSSPrimitiveValue::UnitType::kNumber));
+  if (style.Scale()->Z() != 1) {
+    list->Append(*CSSPrimitiveValue::Create(
+        style.Scale()->Z(), CSSPrimitiveValue::UnitType::kNumber));
+  }
+  return list;
+}
+
+const CSSValue* ScrollBehavior::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetScrollBehavior());
+}
+
+namespace {
+
+static bool ConsumePan(CSSParserTokenRange& range,
+                       CSSValue** pan_x,
+                       CSSValue** pan_y) {
+  CSSValueID id = range.Peek().Id();
+  if ((id == CSSValueID::kPanX || id == CSSValueID::kPanRight ||
+       id == CSSValueID::kPanLeft) &&
+      !*pan_x) {
+    *pan_x = css_property_parser_helpers::ConsumeIdent(range);
+  } else if ((id == CSSValueID::kPanY || id == CSSValueID::kPanDown ||
+              id == CSSValueID::kPanUp) &&
+             !*pan_y) {
+    *pan_y = css_property_parser_helpers::ConsumeIdent(range);
+  } else {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace
+
+const CSSValue* ScrollCustomization::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kAuto || id == CSSValueID::kNone) {
+    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
+    return list;
+  }
+
+  CSSValue* pan_x = nullptr;
+  CSSValue* pan_y = nullptr;
+  if (!ConsumePan(range, &pan_x, &pan_y))
+    return nullptr;
+  if (!range.AtEnd() && !ConsumePan(range, &pan_x, &pan_y))
+    return nullptr;
+
+  if (pan_x)
+    list->Append(*pan_x);
+  if (pan_y)
+    list->Append(*pan_y);
+  return list;
+}
+
+const CSSValue* ScrollCustomization::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ScrollCustomizationFlagsToCSSValue(
+      style.ScrollCustomization());
+}
+
+const CSSValue* ScrollMarginBlockEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginBlockStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginBottom::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginBottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.ScrollMarginBottom(), style);
+}
+
+const CSSValue* ScrollMarginInlineEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginInlineStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginLeft::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginLeft::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.ScrollMarginLeft(), style);
+}
+
+const CSSValue* ScrollMarginRight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginRight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.ScrollMarginRight(), style);
+}
+
+const CSSValue* ScrollMarginTop::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLength(range, context.Mode(), kValueRangeAll,
+                       css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollMarginTop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.ScrollMarginTop(), style);
+}
+
+const CSSValue* ScrollPaddingBlockEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingBlockStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingBottom::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingBottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.ScrollPaddingBottom(), style);
+}
+
+const CSSValue* ScrollPaddingInlineEnd::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingInlineStart::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingLeft::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingLeft::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.ScrollPaddingLeft(), style);
+}
+
+const CSSValue* ScrollPaddingRight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingRight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.ScrollPaddingRight(), style);
+}
+
+const CSSValue* ScrollPaddingTop::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* ScrollPaddingTop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.ScrollPaddingTop(), style);
+}
+
+const CSSValue* ScrollSnapAlign::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValue* block_value = css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kNone, CSSValueID::kStart, CSSValueID::kEnd,
+      CSSValueID::kCenter>(range);
+  if (!block_value)
+    return nullptr;
+  if (range.AtEnd())
+    return block_value;
+
+  CSSValue* inline_value = css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kNone, CSSValueID::kStart, CSSValueID::kEnd,
+      CSSValueID::kCenter>(range);
+  if (!inline_value)
+    return block_value;
+  auto* pair = MakeGarbageCollected<CSSValuePair>(
+      block_value, inline_value, CSSValuePair::kDropIdenticalValues);
+  return pair;
+}
+
+const CSSValue* ScrollSnapAlign::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForScrollSnapAlign(style.GetScrollSnapAlign(),
+                                                     style);
+}
+
+const CSSValue* ScrollSnapStop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.ScrollSnapStop());
+}
+
+const CSSValue* ScrollSnapType::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID axis_id = range.Peek().Id();
+  if (axis_id != CSSValueID::kNone && axis_id != CSSValueID::kX &&
+      axis_id != CSSValueID::kY && axis_id != CSSValueID::kBlock &&
+      axis_id != CSSValueID::kInline && axis_id != CSSValueID::kBoth)
+    return nullptr;
+  CSSValue* axis_value = css_property_parser_helpers::ConsumeIdent(range);
+  if (range.AtEnd() || axis_id == CSSValueID::kNone)
+    return axis_value;
+
+  CSSValueID strictness_id = range.Peek().Id();
+  if (strictness_id != CSSValueID::kProximity &&
+      strictness_id != CSSValueID::kMandatory)
+    return axis_value;
+  CSSValue* strictness_value = css_property_parser_helpers::ConsumeIdent(range);
+  auto* pair = MakeGarbageCollected<CSSValuePair>(
+      axis_value, strictness_value, CSSValuePair::kDropIdenticalValues);
+  return pair;
+}
+
+const CSSValue* ScrollSnapType::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForScrollSnapType(style.GetScrollSnapType(),
+                                                    style);
+}
+
+const CSSValue* ShapeImageThreshold::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* ShapeImageThreshold::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.ShapeImageThreshold(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* ShapeMargin::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative);
+}
+
+const CSSValue* ShapeMargin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return CSSValue::Create(style.ShapeMargin(), style.EffectiveZoom());
+}
+
+const CSSValue* ShapeOutside::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (CSSValue* image_value =
+          css_property_parser_helpers::ConsumeImageOrNone(range, &context))
+    return image_value;
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (CSSValue* box_value = css_property_parser_helpers::ConsumeShapeBox(range))
+    list->Append(*box_value);
+  if (CSSValue* shape_value =
+          css_parsing_utils::ConsumeBasicShape(range, context)) {
+    list->Append(*shape_value);
+    if (list->length() < 2) {
+      if (CSSValue* box_value =
+              css_property_parser_helpers::ConsumeShapeBox(range))
+        list->Append(*box_value);
+    }
+  }
+  if (!list->length())
+    return nullptr;
+  return list;
+}
+
+const CSSValue* ShapeOutside::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForShape(style, style.ShapeOutside());
+}
+
+const CSSValue* ShapeRendering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.ShapeRendering());
+}
+
+static CSSValue* ConsumePageSize(CSSParserTokenRange& range) {
+  return css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kA3, CSSValueID::kA4, CSSValueID::kA5, CSSValueID::kB4,
+      CSSValueID::kB5, CSSValueID::kLedger, CSSValueID::kLegal,
+      CSSValueID::kLetter>(range);
+}
+
+static float MmToPx(float mm) {
+  return mm * kCssPixelsPerMillimeter;
+}
+static float InchToPx(float inch) {
+  return inch * kCssPixelsPerInch;
+}
+static FloatSize GetPageSizeFromName(const CSSIdentifierValue& page_size_name) {
+  switch (page_size_name.GetValueID()) {
+    case CSSValueID::kA5:
+      return FloatSize(MmToPx(148), MmToPx(210));
+    case CSSValueID::kA4:
+      return FloatSize(MmToPx(210), MmToPx(297));
+    case CSSValueID::kA3:
+      return FloatSize(MmToPx(297), MmToPx(420));
+    case CSSValueID::kB5:
+      return FloatSize(MmToPx(176), MmToPx(250));
+    case CSSValueID::kB4:
+      return FloatSize(MmToPx(250), MmToPx(353));
+    case CSSValueID::kLetter:
+      return FloatSize(InchToPx(8.5), InchToPx(11));
+    case CSSValueID::kLegal:
+      return FloatSize(InchToPx(8.5), InchToPx(14));
+    case CSSValueID::kLedger:
+      return FloatSize(InchToPx(11), InchToPx(17));
+    default:
+      NOTREACHED();
+      return FloatSize(0, 0);
+  }
+}
+
+const CSSValue* Size::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  CSSValueList* result = CSSValueList::CreateSpaceSeparated();
+
+  if (range.Peek().Id() == CSSValueID::kAuto) {
+    result->Append(*css_property_parser_helpers::ConsumeIdent(range));
+    return result;
+  }
+
+  if (CSSValue* width = css_property_parser_helpers::ConsumeLength(
+          range, context.Mode(), kValueRangeNonNegative)) {
+    CSSValue* height = css_property_parser_helpers::ConsumeLength(
+        range, context.Mode(), kValueRangeNonNegative);
+    result->Append(*width);
+    if (height)
+      result->Append(*height);
+    return result;
+  }
+
+  CSSValue* page_size = ConsumePageSize(range);
+  CSSValue* orientation =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kPortrait,
+                                                CSSValueID::kLandscape>(range);
+  if (!page_size)
+    page_size = ConsumePageSize(range);
+
+  if (!orientation && !page_size)
+    return nullptr;
+  if (page_size)
+    result->Append(*page_size);
+  if (orientation)
+    result->Append(*orientation);
+  return result;
+}
+
+void Size::ApplyInitial(StyleResolverState& state) const {}
+
+void Size::ApplyInherit(StyleResolverState& state) const {}
+
+void Size::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
+  state.Style()->ResetPageSizeType();
+  FloatSize size;
+  EPageSizeType page_size_type = EPageSizeType::kAuto;
+  const auto& list = To<CSSValueList>(value);
+  if (list.length() == 2) {
+    // <length>{2} | <page-size> <orientation>
+    const CSSValue& first = list.Item(0);
+    const CSSValue& second = list.Item(1);
+    auto* first_primitive_value = DynamicTo<CSSPrimitiveValue>(first);
+    if (first_primitive_value && first_primitive_value->IsLength()) {
+      // <length>{2}
+      size = FloatSize(
+          first_primitive_value->ComputeLength<float>(
+              state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0)),
+          To<CSSPrimitiveValue>(second).ComputeLength<float>(
+              state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0)));
+    } else {
+      // <page-size> <orientation>
+      size = GetPageSizeFromName(To<CSSIdentifierValue>(first));
+
+      DCHECK(To<CSSIdentifierValue>(second).GetValueID() ==
+                 CSSValueID::kLandscape ||
+             To<CSSIdentifierValue>(second).GetValueID() ==
+                 CSSValueID::kPortrait);
+      if (To<CSSIdentifierValue>(second).GetValueID() == CSSValueID::kLandscape)
+        size = size.TransposedSize();
+    }
+    page_size_type = EPageSizeType::kResolved;
+  } else {
+    DCHECK_EQ(list.length(), 1U);
+    // <length> | auto | <page-size> | [ portrait | landscape]
+    const CSSValue& first = list.Item(0);
+    auto* first_primitive_value = DynamicTo<CSSPrimitiveValue>(first);
+    if (first_primitive_value && first_primitive_value->IsLength()) {
+      // <length>
+      page_size_type = EPageSizeType::kResolved;
+      float width = first_primitive_value->ComputeLength<float>(
+          state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0));
+      size = FloatSize(width, width);
+    } else {
+      const auto& ident = To<CSSIdentifierValue>(first);
+      switch (ident.GetValueID()) {
+        case CSSValueID::kAuto:
+          page_size_type = EPageSizeType::kAuto;
+          break;
+        case CSSValueID::kPortrait:
+          page_size_type = EPageSizeType::kPortrait;
+          break;
+        case CSSValueID::kLandscape:
+          page_size_type = EPageSizeType::kLandscape;
+          break;
+        default:
+          // <page-size>
+          page_size_type = EPageSizeType::kResolved;
+          size = GetPageSizeFromName(ident);
+      }
+    }
+  }
+  state.Style()->SetPageSizeType(page_size_type);
+  state.Style()->SetPageSize(size);
+}
+
+const CSSValue* Speak::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Speak());
+}
+
+const CSSValue* StopColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color StopColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = style.StopColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* StopColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(style, style.StopColor());
+}
+
+const CSSValue* StopOpacity::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* StopOpacity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(svg_style.StopOpacity(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* Stroke::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParsePaintStroke(range, context);
+}
+
+const CSSValue* Stroke::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::AdjustSVGPaintForCurrentColor(
+      svg_style.StrokePaint(), style.GetColor());
+}
+
+const CSSValue* StrokeDasharray::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValueList* dashes = CSSValueList::CreateCommaSeparated();
+  do {
+    CSSPrimitiveValue* dash =
+        css_property_parser_helpers::ConsumeLengthOrPercent(
+            range, kSVGAttributeMode, kValueRangeNonNegative);
+    if (!dash ||
+        (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range) &&
+         range.AtEnd()))
+      return nullptr;
+    dashes->Append(*dash);
+  } while (!range.AtEnd());
+  return dashes;
+}
+
+const CSSValue* StrokeDasharray::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::StrokeDashArrayToCSSValueList(
+      *svg_style.StrokeDashArray(), style);
+}
+
+const CSSValue* StrokeDashoffset::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, kSVGAttributeMode, kValueRangeAll,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* StrokeDashoffset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.StrokeDashOffset(), style);
+}
+
+const CSSValue* StrokeLinecap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.CapStyle());
+}
+
+const CSSValue* StrokeLinejoin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.JoinStyle());
+}
+
+const CSSValue* StrokeMiterlimit::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range,
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* StrokeMiterlimit::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(svg_style.StrokeMiterLimit(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* StrokeOpacity::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* StrokeOpacity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle&,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(svg_style.StrokeOpacity(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* StrokeWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, kSVGAttributeMode, kValueRangeNonNegative,
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* StrokeWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const Length& length = svg_style.StrokeWidth().length();
+  if (length.IsFixed()) {
+    return CSSPrimitiveValue::Create(length.Value(),
+                                     CSSPrimitiveValue::UnitType::kPixels);
+  }
+  return CSSValue::Create(length, style.EffectiveZoom());
+}
+
+const CSSValue* TabSize::ParseSingleValue(CSSParserTokenRange& range,
+                                          const CSSParserContext& context,
+                                          const CSSParserLocalContext&) const {
+  CSSPrimitiveValue* parsed_value =
+      css_property_parser_helpers::ConsumeInteger(range, 0);
+  if (parsed_value)
+    return parsed_value;
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* TabSize::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.GetTabSize().GetPixelSize(1.0),
+                                   style.GetTabSize().IsSpaces()
+                                       ? CSSPrimitiveValue::UnitType::kNumber
+                                       : CSSPrimitiveValue::UnitType::kPixels);
+}
+
+const CSSValue* TableLayout::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TableLayout());
+}
+
+const CSSValue* TextAlign::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetTextAlign());
+}
+
+void TextAlign::ApplyValue(StyleResolverState& state,
+                           const CSSValue& value) const {
+  const auto* ident_value = DynamicTo<CSSIdentifierValue>(value);
+  if (ident_value &&
+      ident_value->GetValueID() != CSSValueID::kWebkitMatchParent) {
+    // Special case for th elements - UA stylesheet text-align does not apply if
+    // parent's computed value for text-align is not its initial value
+    // https://html.spec.whatwg.org/C/#tables-2
+    if (ident_value->GetValueID() == CSSValueID::kInternalCenter &&
+        state.ParentStyle()->GetTextAlign() !=
+            ComputedStyleInitialValues::InitialTextAlign())
+      state.Style()->SetTextAlign(state.ParentStyle()->GetTextAlign());
+    else
+      state.Style()->SetTextAlign(ident_value->ConvertTo<ETextAlign>());
+  } else if (state.ParentStyle()->GetTextAlign() == ETextAlign::kStart) {
+    state.Style()->SetTextAlign(state.ParentStyle()->IsLeftToRightDirection()
+                                    ? ETextAlign::kLeft
+                                    : ETextAlign::kRight);
+  } else if (state.ParentStyle()->GetTextAlign() == ETextAlign::kEnd) {
+    state.Style()->SetTextAlign(state.ParentStyle()->IsLeftToRightDirection()
+                                    ? ETextAlign::kRight
+                                    : ETextAlign::kLeft);
+  } else {
+    state.Style()->SetTextAlign(state.ParentStyle()->GetTextAlign());
+  }
+}
+
+const CSSValue* TextAlignLast::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TextAlignLast());
+}
+
+const CSSValue* TextAnchor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.TextAnchor());
+}
+
+const CSSValue* TextCombineUpright::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TextCombine());
+}
+
+const CSSValue* TextDecorationColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color TextDecorationColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = style.DecorationColorIncludingFallback(visited_link);
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* TextDecorationColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(
+      style, style.TextDecorationColor());
+}
+
+const CSSValue* TextDecorationLine::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeTextDecorationLine(range);
+}
+
+const CSSValue* TextDecorationLine::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::RenderTextDecorationFlagsToCSSValue(
+      style.GetTextDecoration());
+}
+
+const CSSValue* TextDecorationSkipInk::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForTextDecorationSkipInk(
+      style.TextDecorationSkipInk());
+}
+
+const CSSValue* TextDecorationStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForTextDecorationStyle(
+      style.TextDecorationStyle());
+}
+
+const CSSValue* TextIndent::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // [ <length> | <percentage> ] && hanging? && each-line?
+  // Keywords only allowed when css3Text is enabled.
+  CSSValue* length_percentage = nullptr;
+  CSSValue* hanging = nullptr;
+  CSSValue* each_line = nullptr;
+  do {
+    if (!length_percentage) {
+      length_percentage = css_property_parser_helpers::ConsumeLengthOrPercent(
+          range, context.Mode(), kValueRangeAll,
+          css_property_parser_helpers::UnitlessQuirk::kAllow);
+      if (length_percentage) {
+        continue;
+      }
+    }
+
+    if (RuntimeEnabledFeatures::CSS3TextEnabled()) {
+      CSSValueID id = range.Peek().Id();
+      if (!hanging && id == CSSValueID::kHanging) {
+        hanging = css_property_parser_helpers::ConsumeIdent(range);
+        continue;
+      }
+      if (!each_line && id == CSSValueID::kEachLine) {
+        each_line = css_property_parser_helpers::ConsumeIdent(range);
+        continue;
+      }
+    }
+    return nullptr;
+  } while (!range.AtEnd());
+
+  if (!length_percentage)
+    return nullptr;
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*length_percentage);
+
+  if (hanging)
+    list->Append(*hanging);
+
+  if (each_line)
+    list->Append(*each_line);
+
+  return list;
+}
+
+const CSSValue* TextIndent::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.TextIndent(), style));
+  if (RuntimeEnabledFeatures::CSS3TextEnabled()) {
+    if (style.GetTextIndentType() == TextIndentType::kHanging)
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kHanging));
+    if (style.GetTextIndentLine() == TextIndentLine::kEachLine)
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kEachLine));
+  }
+  return list;
+}
+
+void TextIndent::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetTextIndent(ComputedStyleInitialValues::InitialTextIndent());
+  state.Style()->SetTextIndentLine(
+      ComputedStyleInitialValues::InitialTextIndentLine());
+  state.Style()->SetTextIndentType(
+      ComputedStyleInitialValues::InitialTextIndentType());
+}
+
+void TextIndent::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetTextIndent(state.ParentStyle()->TextIndent());
+  state.Style()->SetTextIndentLine(state.ParentStyle()->GetTextIndentLine());
+  state.Style()->SetTextIndentType(state.ParentStyle()->GetTextIndentType());
+}
+
+void TextIndent::ApplyValue(StyleResolverState& state,
+                            const CSSValue& value) const {
+  Length length_or_percentage_value;
+  TextIndentLine text_indent_line_value =
+      ComputedStyleInitialValues::InitialTextIndentLine();
+  TextIndentType text_indent_type_value =
+      ComputedStyleInitialValues::InitialTextIndentType();
+
+  for (auto& list_value : To<CSSValueList>(value)) {
+    if (auto* list_primitive_value =
+            DynamicTo<CSSPrimitiveValue>(*list_value)) {
+      length_or_percentage_value = list_primitive_value->ConvertToLength(
+          state.CssToLengthConversionData());
+    } else if (To<CSSIdentifierValue>(*list_value).GetValueID() ==
+               CSSValueID::kEachLine) {
+      text_indent_line_value = TextIndentLine::kEachLine;
+    } else if (To<CSSIdentifierValue>(*list_value).GetValueID() ==
+               CSSValueID::kHanging) {
+      text_indent_type_value = TextIndentType::kHanging;
+    } else {
+      NOTREACHED();
+    }
+  }
+
+  state.Style()->SetTextIndent(length_or_percentage_value);
+  state.Style()->SetTextIndentLine(text_indent_line_value);
+  state.Style()->SetTextIndentType(text_indent_type_value);
+}
+
+const CSSValue* TextJustify::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetTextJustify());
+}
+
+const CSSValue* TextOrientation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetTextOrientation());
+}
+
+void TextOrientation::ApplyValue(StyleResolverState& state,
+                                 const CSSValue& value) const {
+  state.SetTextOrientation(
+      To<CSSIdentifierValue>(value).ConvertTo<ETextOrientation>());
+}
+
+const CSSValue* TextOverflow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.TextOverflow() != ETextOverflow::kClip)
+    return CSSIdentifierValue::Create(CSSValueID::kEllipsis);
+  return CSSIdentifierValue::Create(CSSValueID::kClip);
+}
+
+const CSSValue* TextRendering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetFontDescription().TextRendering());
+}
+
+const CSSValue* TextShadow::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeShadow(
+      range, context.Mode(), css_parsing_utils::AllowInsetAndSpread::kForbid);
+}
+
+const CSSValue* TextShadow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForShadowList(style.TextShadow(), style,
+                                                false);
+}
+
+const CSSValue* TextSizeAdjust::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumePercent(range,
+                                                     kValueRangeNonNegative);
+}
+
+const CSSValue* TextSizeAdjust::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.GetTextSizeAdjust().IsAuto())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return CSSPrimitiveValue::Create(style.GetTextSizeAdjust().Multiplier() * 100,
+                                   CSSPrimitiveValue::UnitType::kPercentage);
+}
+
+const CSSValue* TextTransform::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TextTransform());
+}
+
+// auto | [ under || [ left | right ] ]
+const CSSValue* TextUnderlinePosition::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSIdentifierValue* under_value =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
+  CSSIdentifierValue* left_or_right_value = nullptr;
+  if (RuntimeEnabledFeatures::TextUnderlinePositionLeftRightEnabled()) {
+    left_or_right_value =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kLeft,
+                                                  CSSValueID::kRight>(range);
+    if (left_or_right_value && !under_value) {
+      under_value =
+          css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
+    }
+  }
+  if (!under_value && !left_or_right_value) {
+    return nullptr;
+  }
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (under_value)
+    list->Append(*under_value);
+  if (left_or_right_value)
+    list->Append(*left_or_right_value);
+  return list;
+}
+
+const CSSValue* TextUnderlinePosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  auto text_underline_position = style.TextUnderlinePosition();
+  if (text_underline_position == kTextUnderlinePositionAuto)
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  if (text_underline_position == kTextUnderlinePositionUnder)
+    return CSSIdentifierValue::Create(CSSValueID::kUnder);
+  if (text_underline_position == kTextUnderlinePositionLeft)
+    return CSSIdentifierValue::Create(CSSValueID::kLeft);
+  if (text_underline_position == kTextUnderlinePositionRight)
+    return CSSIdentifierValue::Create(CSSValueID::kRight);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  DCHECK(text_underline_position & kTextUnderlinePositionUnder);
+  list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
+  if (text_underline_position & kTextUnderlinePositionLeft)
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
+  if (text_underline_position & kTextUnderlinePositionRight)
+    list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
+  DCHECK_EQ(list->length(), 2U);
+  return list;
+}
+
+const CSSValue* Top::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeMarginOrOffset(
+      range, context.Mode(),
+      css_parsing_utils::UnitlessUnlessShorthand(local_context));
+}
+
+bool Top::IsLayoutDependent(const ComputedStyle* style,
+                            LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* Top::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
+                                                    layout_object);
+}
+
+namespace {
+
+static bool ConsumePan(CSSParserTokenRange& range,
+                       CSSValue*& pan_x,
+                       CSSValue*& pan_y,
+                       CSSValue*& pinch_zoom) {
+  CSSValueID id = range.Peek().Id();
+  if ((id == CSSValueID::kPanX || id == CSSValueID::kPanRight ||
+       id == CSSValueID::kPanLeft) &&
+      !pan_x) {
+    pan_x = css_property_parser_helpers::ConsumeIdent(range);
+  } else if ((id == CSSValueID::kPanY || id == CSSValueID::kPanDown ||
+              id == CSSValueID::kPanUp) &&
+             !pan_y) {
+    pan_y = css_property_parser_helpers::ConsumeIdent(range);
+  } else if (id == CSSValueID::kPinchZoom && !pinch_zoom) {
+    pinch_zoom = css_property_parser_helpers::ConsumeIdent(range);
+  } else {
+    return false;
+  }
+  return true;
+}
+
+}  // namespace
+
+const CSSValue* TouchAction::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kAuto || id == CSSValueID::kNone ||
+      id == CSSValueID::kManipulation) {
+    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
+    return list;
+  }
+
+  CSSValue* pan_x = nullptr;
+  CSSValue* pan_y = nullptr;
+  CSSValue* pinch_zoom = nullptr;
+  if (!ConsumePan(range, pan_x, pan_y, pinch_zoom))
+    return nullptr;
+  if (!range.AtEnd() && !ConsumePan(range, pan_x, pan_y, pinch_zoom))
+    return nullptr;
+  if (!range.AtEnd() && !ConsumePan(range, pan_x, pan_y, pinch_zoom))
+    return nullptr;
+
+  if (pan_x)
+    list->Append(*pan_x);
+  if (pan_y)
+    list->Append(*pan_y);
+  if (pinch_zoom)
+    list->Append(*pinch_zoom);
+  return list;
+}
+
+const CSSValue* TouchAction::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::TouchActionFlagsToCSSValue(style.GetTouchAction());
+}
+
+const CSSValue* TransformBox::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TransformBox());
+}
+
+const CSSValue* Transform::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ConsumeTransformList(range, context, local_context);
+}
+
+bool Transform::IsLayoutDependent(const ComputedStyle* style,
+                                  LayoutObject* layout_object) const {
+  return layout_object &&
+         (layout_object->IsBox() || layout_object->IsSVGChild());
+}
+
+const CSSValue* Transform::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ComputedTransform(layout_object, style);
+}
+
+const CSSValue* TransformOrigin::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValue* result_x = nullptr;
+  CSSValue* result_y = nullptr;
+  if (css_property_parser_helpers::ConsumeOneOrTwoValuedPosition(
+          range, context.Mode(),
+          css_property_parser_helpers::UnitlessQuirk::kForbid, result_x,
+          result_y)) {
+    CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+    list->Append(*result_x);
+    list->Append(*result_y);
+    CSSValue* result_z = css_property_parser_helpers::ConsumeLength(
+        range, context.Mode(), kValueRangeAll);
+    if (result_z)
+      list->Append(*result_z);
+    return list;
+  }
+  return nullptr;
+}
+
+bool TransformOrigin::IsLayoutDependent(const ComputedStyle* style,
+                                        LayoutObject* layout_object) const {
+  return layout_object &&
+         (layout_object->IsBox() || layout_object->IsSVGChild());
+}
+
+const CSSValue* TransformOrigin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  if (layout_object) {
+    FloatRect reference_box = ComputedStyleUtils::ReferenceBoxForTransform(
+        *layout_object, ComputedStyleUtils::kDontUsePixelSnappedBox);
+    FloatSize resolved_origin(
+        FloatValueForLength(style.TransformOriginX(), reference_box.Width()),
+        FloatValueForLength(style.TransformOriginY(), reference_box.Height()));
+    list->Append(*ZoomAdjustedPixelValue(resolved_origin.Width(), style));
+    list->Append(*ZoomAdjustedPixelValue(resolved_origin.Height(), style));
+  } else {
+    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+        style.TransformOriginX(), style));
+    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+        style.TransformOriginY(), style));
+  }
+  if (style.TransformOriginZ() != 0)
+    list->Append(*ZoomAdjustedPixelValue(style.TransformOriginZ(), style));
+  return list;
+}
+
+const CSSValue* TransformStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(
+      (style.TransformStyle3D() == ETransformStyle3D::kPreserve3d)
+          ? CSSValueID::kPreserve3d
+          : CSSValueID::kFlat);
+}
+
+const CSSValue* TransitionDelay::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeTime, range, kValueRangeAll);
+}
+
+const CSSValue* TransitionDelay::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationDelay(style.Transitions());
+}
+
+const CSSValue* TransitionDelay::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSValue>, value,
+      (CSSPrimitiveValue::Create(CSSTimingData::InitialDelay(),
+                                 CSSPrimitiveValue::UnitType::kSeconds)));
+  return value;
+}
+
+const CSSValue* TransitionDuration::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeTime, range, kValueRangeNonNegative);
+}
+
+const CSSValue* TransitionDuration::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationDuration(style.Transitions());
+}
+
+const CSSValue* TransitionDuration::InitialValue() const {
+  DEFINE_STATIC_LOCAL(
+      Persistent<CSSValue>, value,
+      (CSSPrimitiveValue::Create(CSSTimingData::InitialDuration(),
+                                 CSSPrimitiveValue::UnitType::kSeconds)));
+  return value;
+}
+
+const CSSValue* TransitionProperty::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueList* list = css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeTransitionProperty, range, context);
+  if (!list || !css_parsing_utils::IsValidPropertyList(*list))
+    return nullptr;
+  return list;
+}
+
+const CSSValue* TransitionProperty::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForTransitionProperty(style.Transitions());
+}
+
+const CSSValue* TransitionProperty::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kAll)));
+  return value;
+}
+
+const CSSValue* TransitionTimingFunction::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeAnimationTimingFunction, range);
+}
+
+const CSSValue* TransitionTimingFunction::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForAnimationTimingFunction(
+      style.Transitions());
+}
+
+const CSSValue* TransitionTimingFunction::InitialValue() const {
+  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
+                      (CSSIdentifierValue::Create(CSSValueID::kEase)));
+  return value;
+}
+
+const CSSValue* Translate::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValue* translate_x = css_property_parser_helpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeAll);
+  if (!translate_x)
+    return nullptr;
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*translate_x);
+  CSSPrimitiveValue* translate_y =
+      css_property_parser_helpers::ConsumeLengthOrPercent(range, context.Mode(),
+                                                          kValueRangeAll);
+  if (translate_y) {
+    CSSValue* translate_z = css_property_parser_helpers::ConsumeLength(
+        range, context.Mode(), kValueRangeAll);
+    if (translate_y->GetIntValue() == 0 && !translate_z)
+      return list;
+
+    list->Append(*translate_y);
+    if (translate_z) {
+      list->Append(*translate_z);
+    }
+  }
+
+  return list;
+}
+
+bool Translate::IsLayoutDependent(const ComputedStyle* style,
+                                  LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
+const CSSValue* Translate::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.Translate())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+      style.Translate()->X(), style));
+
+  if (!style.Translate()->Y().IsZero() || style.Translate()->Z() != 0) {
+    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+        style.Translate()->Y(), style));
+  }
+
+  if (style.Translate()->Z() != 0)
+    list->Append(*ZoomAdjustedPixelValue(style.Translate()->Z(), style));
+
+  return list;
+}
+
+const CSSValue* UnicodeBidi::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetUnicodeBidi());
+}
+
+const CSSValue* UserSelect::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.UserSelect());
+}
+
+const CSSValue* VectorEffect::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(svg_style.VectorEffect());
+}
+
+const CSSValue* VerticalAlign::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValue* parsed_value = css_property_parser_helpers::ConsumeIdentRange(
+      range, CSSValueID::kBaseline, CSSValueID::kWebkitBaselineMiddle);
+  if (!parsed_value) {
+    parsed_value = css_property_parser_helpers::ConsumeLengthOrPercent(
+        range, context.Mode(), kValueRangeAll,
+        css_property_parser_helpers::UnitlessQuirk::kAllow);
+  }
+  return parsed_value;
+}
+
+const CSSValue* VerticalAlign::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  switch (style.VerticalAlign()) {
+    case EVerticalAlign::kBaseline:
+      return CSSIdentifierValue::Create(CSSValueID::kBaseline);
+    case EVerticalAlign::kMiddle:
+      return CSSIdentifierValue::Create(CSSValueID::kMiddle);
+    case EVerticalAlign::kSub:
+      return CSSIdentifierValue::Create(CSSValueID::kSub);
+    case EVerticalAlign::kSuper:
+      return CSSIdentifierValue::Create(CSSValueID::kSuper);
+    case EVerticalAlign::kTextTop:
+      return CSSIdentifierValue::Create(CSSValueID::kTextTop);
+    case EVerticalAlign::kTextBottom:
+      return CSSIdentifierValue::Create(CSSValueID::kTextBottom);
+    case EVerticalAlign::kTop:
+      return CSSIdentifierValue::Create(CSSValueID::kTop);
+    case EVerticalAlign::kBottom:
+      return CSSIdentifierValue::Create(CSSValueID::kBottom);
+    case EVerticalAlign::kBaselineMiddle:
+      return CSSIdentifierValue::Create(CSSValueID::kWebkitBaselineMiddle);
+    case EVerticalAlign::kLength:
+      return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
+          style.GetVerticalAlignLength(), style);
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+void VerticalAlign::ApplyInherit(StyleResolverState& state) const {
+  EVerticalAlign vertical_align = state.ParentStyle()->VerticalAlign();
+  state.Style()->SetVerticalAlign(vertical_align);
+  if (vertical_align == EVerticalAlign::kLength) {
+    state.Style()->SetVerticalAlignLength(
+        state.ParentStyle()->GetVerticalAlignLength());
+  }
+}
+
+void VerticalAlign::ApplyValue(StyleResolverState& state,
+                               const CSSValue& value) const {
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    state.Style()->SetVerticalAlign(
+        identifier_value->ConvertTo<EVerticalAlign>());
+  } else {
+    state.Style()->SetVerticalAlignLength(
+        To<CSSPrimitiveValue>(value).ConvertToLength(
+            state.CssToLengthConversionData()));
+  }
+}
+
+const CSSValue* Visibility::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Visibility());
+}
+
+const CSSValue* WebkitAppRegion::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  if (style.DraggableRegionMode() == EDraggableRegionMode::kNone)
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return CSSIdentifierValue::Create(style.DraggableRegionMode() ==
+                                            EDraggableRegionMode::kDrag
+                                        ? CSSValueID::kDrag
+                                        : CSSValueID::kNoDrag);
+}
+
+void WebkitAppRegion::ApplyInitial(StyleResolverState& state) const {}
+
+void WebkitAppRegion::ApplyInherit(StyleResolverState& state) const {}
+
+void WebkitAppRegion::ApplyValue(StyleResolverState& state,
+                                 const CSSValue& value) const {
+  const auto& identifier_value = To<CSSIdentifierValue>(value);
+  state.Style()->SetDraggableRegionMode(identifier_value.GetValueID() ==
+                                                CSSValueID::kDrag
+                                            ? EDraggableRegionMode::kDrag
+                                            : EDraggableRegionMode::kNoDrag);
+  state.GetDocument().SetHasAnnotatedRegions(true);
+}
+
+const CSSValue* WebkitAppearance::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.Appearance());
+}
+
+const CSSValue* WebkitBorderHorizontalSpacing::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue*
+WebkitBorderHorizontalSpacing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.HorizontalBorderSpacing(), style);
+}
+
+const CSSValue* WebkitBorderImage::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWebkitBorderImage(range, context);
+}
+
+const CSSValue* WebkitBorderImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImage(style.BorderImage(), style);
+}
+
+void WebkitBorderImage::ApplyValue(StyleResolverState& state,
+                                   const CSSValue& value) const {
+  NinePieceImage image;
+  CSSToStyleMap::MapNinePieceImage(state, CSSPropertyID::kWebkitBorderImage,
+                                   value, image);
+  state.Style()->SetBorderImage(image);
+}
+
+const CSSValue* WebkitBorderVerticalSpacing::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeNonNegative);
+}
+
+const CSSValue* WebkitBorderVerticalSpacing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.VerticalBorderSpacing(), style);
+}
+
+const CSSValue* WebkitBoxAlign::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BoxAlign());
+}
+
+const CSSValue* WebkitBoxDecorationBreak::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.BoxDecorationBreak() == EBoxDecorationBreak::kSlice)
+    return CSSIdentifierValue::Create(CSSValueID::kSlice);
+  return CSSIdentifierValue::Create(CSSValueID::kClone);
+}
+
+const CSSValue* WebkitBoxDirection::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BoxDirection());
+}
+
+const CSSValue* WebkitBoxFlex::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
+}
+
+const CSSValue* WebkitBoxFlex::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.BoxFlex(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* WebkitBoxOrdinalGroup::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumePositiveInteger(range);
+}
+
+const CSSValue* WebkitBoxOrdinalGroup::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.BoxOrdinalGroup(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* WebkitBoxOrient::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BoxOrient());
+}
+
+const CSSValue* WebkitBoxPack::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.BoxPack());
+}
+
+namespace {
+
+CSSValue* ConsumeReflect(CSSParserTokenRange& range,
+                         const CSSParserContext& context) {
+  CSSIdentifierValue* direction = css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kAbove, CSSValueID::kBelow, CSSValueID::kLeft,
+      CSSValueID::kRight>(range);
+  if (!direction)
+    return nullptr;
+
+  CSSPrimitiveValue* offset = nullptr;
+  if (range.AtEnd()) {
+    offset = CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kPixels);
+  } else {
+    offset = ConsumeLengthOrPercent(
+        range, context.Mode(), kValueRangeAll,
+        css_property_parser_helpers::UnitlessQuirk::kForbid);
+    if (!offset)
+      return nullptr;
+  }
+
+  CSSValue* mask = nullptr;
+  if (!range.AtEnd()) {
+    mask = css_parsing_utils::ConsumeWebkitBorderImage(range, context);
+    if (!mask)
+      return nullptr;
+  }
+  return MakeGarbageCollected<cssvalue::CSSReflectValue>(direction, offset,
+                                                         mask);
+}
+
+}  // namespace
+
+const CSSValue* WebkitBoxReflect::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return ConsumeReflect(range, context);
+}
+
+const CSSValue* WebkitBoxReflect::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForReflection(style.BoxReflect(), style);
+}
+
+const CSSValue* WebkitFontSizeDelta::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(
+      range, context.Mode(), kValueRangeAll,
+      css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+const CSSValue* WebkitFontSmoothing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetFontDescription().FontSmoothing());
+}
+
+const CSSValue* WebkitHighlight::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeString(range);
+}
+
+const CSSValue* WebkitHighlight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.Highlight() == g_null_atom)
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return MakeGarbageCollected<CSSStringValue>(style.Highlight());
+}
+
+const CSSValue* WebkitHyphenateCharacter::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeString(range);
+}
+
+const CSSValue* WebkitHyphenateCharacter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HyphenationString().IsNull())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return MakeGarbageCollected<CSSStringValue>(style.HyphenationString());
+}
+
+const CSSValue* WebkitLineBreak::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetLineBreak());
+}
+
+const CSSValue* WebkitLineClamp::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  // When specifying number of lines, don't allow 0 as a valid value.
+  return css_property_parser_helpers::ConsumePositiveInteger(range);
+}
+
+const CSSValue* WebkitLineClamp::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (!style.HasLineClamp())
+    return CSSIdentifierValue::Create(CSSValueID::kNone);
+  return CSSPrimitiveValue::Create(style.LineClamp(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* WebkitLocale::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeString(range);
+}
+
+const CSSValue* WebkitLocale::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.Locale().IsNull())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return MakeGarbageCollected<CSSStringValue>(style.Locale());
+}
+
+void WebkitLocale::ApplyValue(StyleResolverState& state,
+                              const CSSValue& value) const {
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kAuto);
+    state.GetFontBuilder().SetLocale(nullptr);
+  } else {
+    state.GetFontBuilder().SetLocale(
+        LayoutLocale::Get(AtomicString(To<CSSStringValue>(value).Value())));
+  }
+}
+
+const CSSValue* WebkitMarginAfterCollapse::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.MarginAfterCollapse());
+}
+
+const CSSValue* WebkitMarginBeforeCollapse::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.MarginBeforeCollapse());
+}
+
+const CSSValue* WebkitMarginBottomCollapse::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.MarginAfterCollapse());
+}
+
+const CSSValue* WebkitMarginTopCollapse::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.MarginBeforeCollapse());
+}
+
+const CSSValue* WebkitMaskBoxImageOutset::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageOutset(range);
+}
+
+const CSSValue* WebkitMaskBoxImageOutset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageQuad(
+      style.MaskBoxImage().Outset(), style);
+}
+
+const CSSValue* WebkitMaskBoxImageRepeat::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageRepeat(range);
+}
+
+const CSSValue* WebkitMaskBoxImageRepeat::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageRepeat(style.MaskBoxImage());
+}
+
+const CSSValue* WebkitMaskBoxImageSlice::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageSlice(
+      range, css_parsing_utils::DefaultFill::kNoFill);
+}
+
+const CSSValue* WebkitMaskBoxImageSlice::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageSlice(style.MaskBoxImage());
+}
+
+const CSSValue* WebkitMaskBoxImageSource::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
+}
+
+const CSSValue* WebkitMaskBoxImageSource::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  if (style.MaskBoxImageSource())
+    return style.MaskBoxImageSource()->ComputedCSSValue();
+  return CSSIdentifierValue::Create(CSSValueID::kNone);
+}
+
+void WebkitMaskBoxImageSource::ApplyValue(StyleResolverState& state,
+                                          const CSSValue& value) const {
+  state.Style()->SetMaskBoxImageSource(
+      state.GetStyleImage(CSSPropertyID::kWebkitMaskBoxImageSource, value));
+}
+
+const CSSValue* WebkitMaskBoxImageWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeBorderImageWidth(range);
+}
+
+const CSSValue* WebkitMaskBoxImageWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImageQuad(
+      style.MaskBoxImage().BorderSlices(), style);
+}
+
+const CSSValue* WebkitMaskClip::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePrefixedBackgroundBox, range,
+      css_parsing_utils::AllowTextValue::kAllow);
+}
+
+const CSSValue* WebkitMaskClip::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const FillLayer* curr_layer = &style.MaskLayers();
+  for (; curr_layer; curr_layer = curr_layer->Next()) {
+    EFillBox box = curr_layer->Clip();
+    list->Append(*CSSIdentifierValue::Create(box));
+  }
+  return list;
+}
+
+const CSSValue* WebkitMaskComposite::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumeBackgroundComposite, range);
+}
+
+const CSSValue* WebkitMaskComposite::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const FillLayer* curr_layer = &style.MaskLayers();
+  for (; curr_layer; curr_layer = curr_layer->Next())
+    list->Append(*CSSIdentifierValue::Create(curr_layer->Composite()));
+  return list;
+}
+
+const CSSValue* WebkitMaskImage::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_property_parser_helpers::ConsumeImageOrNone, range, &context);
+}
+
+const CSSValue* WebkitMaskImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer& fill_layer = style.MaskLayers();
+  return ComputedStyleUtils::BackgroundImageOrWebkitMaskImage(fill_layer);
+}
+
+const CSSValue* WebkitMaskOrigin::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePrefixedBackgroundBox, range,
+      css_parsing_utils::AllowTextValue::kForbid);
+}
+
+const CSSValue* WebkitMaskOrigin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateCommaSeparated();
+  const FillLayer* curr_layer = &style.MaskLayers();
+  for (; curr_layer; curr_layer = curr_layer->Next()) {
+    EFillBox box = curr_layer->Origin();
+    list->Append(*CSSIdentifierValue::Create(box));
+  }
+  return list;
+}
+
+const CSSValue* WebkitMaskPositionX::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
+                                                 CSSValueID::kRight>,
+      range, context.Mode());
+}
+
+const CSSValue* WebkitMaskPositionX::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer* curr_layer = &style.MaskLayers();
+  return ComputedStyleUtils::BackgroundPositionXOrWebkitMaskPositionX(
+      style, curr_layer);
+}
+
+const CSSValue* WebkitMaskPositionY::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeCommaSeparatedList(
+      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
+                                                 CSSValueID::kBottom>,
+      range, context.Mode());
+}
+
+const CSSValue* WebkitMaskPositionY::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer* curr_layer = &style.MaskLayers();
+  return ComputedStyleUtils::BackgroundPositionYOrWebkitMaskPositionY(
+      style, curr_layer);
+}
+
+const CSSValue* WebkitMaskSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return css_parsing_utils::ParseBackgroundOrMaskSize(
+      range, context, local_context, WebFeature::kNegativeMaskSize);
+}
+
+const CSSValue* WebkitMaskSize::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  const FillLayer& fill_layer = style.MaskLayers();
+  return ComputedStyleUtils::BackgroundImageOrWebkitMaskSize(style, fill_layer);
+}
+
+const CSSValue* WebkitPerspectiveOriginX::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
+                                                    CSSValueID::kRight>(
+      range, context.Mode());
+}
+
+const CSSValue* WebkitPerspectiveOriginY::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
+                                                    CSSValueID::kBottom>(
+      range, context.Mode());
+}
+
+const CSSValue* WebkitPrintColorAdjust::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.PrintColorAdjust());
+}
+
+const CSSValue* WebkitRtlOrdering::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.RtlOrdering() == EOrder::kVisual
+                                        ? CSSValueID::kVisual
+                                        : CSSValueID::kLogical);
+}
+
+const CSSValue* WebkitRubyPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetRubyPosition());
+}
+
+const CSSValue* WebkitTapHighlightColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color WebkitTapHighlightColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = style.TapHighlightColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* WebkitTapHighlightColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(
+      style, style.TapHighlightColor());
+}
+
+const CSSValue* WebkitTextCombine::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.TextCombine() == ETextCombine::kAll)
+    return CSSIdentifierValue::Create(CSSValueID::kHorizontal);
+  return CSSIdentifierValue::Create(style.TextCombine());
+}
+
+const CSSValue* WebkitTextDecorationsInEffect::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeTextDecorationLine(range);
+}
+
+const CSSValue*
+WebkitTextDecorationsInEffect::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::RenderTextDecorationFlagsToCSSValue(
+      style.TextDecorationsInEffect());
+}
+
+const CSSValue* WebkitTextEmphasisColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color WebkitTextEmphasisColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkTextEmphasisColor()
+                                   : style.TextEmphasisColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* WebkitTextEmphasisColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(
+      style, style.TextEmphasisColor());
+}
+
+// [ over | under ] && [ right | left ]?
+// If [ right | left ] is omitted, it defaults to right.
+const CSSValue* WebkitTextEmphasisPosition::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSIdentifierValue* values[2] = {
+      css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kOver, CSSValueID::kUnder, CSSValueID::kRight,
+          CSSValueID::kLeft>(range),
+      nullptr};
+  if (!values[0])
+    return nullptr;
+  values[1] = css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kOver, CSSValueID::kUnder, CSSValueID::kRight,
+      CSSValueID::kLeft>(range);
+  CSSIdentifierValue* over_under = nullptr;
+  CSSIdentifierValue* left_right = nullptr;
+
+  for (auto* value : values) {
+    if (!value)
+      break;
+    switch (value->GetValueID()) {
+      case CSSValueID::kOver:
+      case CSSValueID::kUnder:
+        if (over_under)
+          return nullptr;
+        over_under = value;
+        break;
+      case CSSValueID::kLeft:
+      case CSSValueID::kRight:
+        if (left_right)
+          return nullptr;
+        left_right = value;
+        break;
+      default:
+        NOTREACHED();
+        break;
+    }
+  }
+  if (!over_under)
+    return nullptr;
+  if (!left_right)
+    left_right = CSSIdentifierValue::Create(CSSValueID::kRight);
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*over_under);
+  list->Append(*left_right);
+  return list;
+}
+
+const CSSValue* WebkitTextEmphasisPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  switch (style.GetTextEmphasisPosition()) {
+    case TextEmphasisPosition::kOverRight:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kOver));
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
+      break;
+    case TextEmphasisPosition::kOverLeft:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kOver));
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
+      break;
+    case TextEmphasisPosition::kUnderRight:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
+      break;
+    case TextEmphasisPosition::kUnderLeft:
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
+      list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
+      break;
+  }
+  return list;
+}
+
+const CSSValue* WebkitTextEmphasisStyle::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValueID id = range.Peek().Id();
+  if (id == CSSValueID::kNone)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  if (CSSValue* text_emphasis_style =
+          css_property_parser_helpers::ConsumeString(range))
+    return text_emphasis_style;
+
+  CSSIdentifierValue* fill =
+      css_property_parser_helpers::ConsumeIdent<CSSValueID::kFilled,
+                                                CSSValueID::kOpen>(range);
+  CSSIdentifierValue* shape = css_property_parser_helpers::ConsumeIdent<
+      CSSValueID::kDot, CSSValueID::kCircle, CSSValueID::kDoubleCircle,
+      CSSValueID::kTriangle, CSSValueID::kSesame>(range);
+  if (!fill) {
+    fill = css_property_parser_helpers::ConsumeIdent<CSSValueID::kFilled,
+                                                     CSSValueID::kOpen>(range);
+  }
+  if (fill && shape) {
+    CSSValueList* parsed_values = CSSValueList::CreateSpaceSeparated();
+    parsed_values->Append(*fill);
+    parsed_values->Append(*shape);
+    return parsed_values;
+  }
+  if (fill)
+    return fill;
+  if (shape)
+    return shape;
+  return nullptr;
+}
+
+const CSSValue* WebkitTextEmphasisStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  switch (style.GetTextEmphasisMark()) {
+    case TextEmphasisMark::kNone:
+      return CSSIdentifierValue::Create(CSSValueID::kNone);
+    case TextEmphasisMark::kCustom:
+      return MakeGarbageCollected<CSSStringValue>(
+          style.TextEmphasisCustomMark());
+    case TextEmphasisMark::kAuto:
+      NOTREACHED();
+      FALLTHROUGH;
+    case TextEmphasisMark::kDot:
+    case TextEmphasisMark::kCircle:
+    case TextEmphasisMark::kDoubleCircle:
+    case TextEmphasisMark::kTriangle:
+    case TextEmphasisMark::kSesame: {
+      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+      list->Append(*CSSIdentifierValue::Create(style.GetTextEmphasisFill()));
+      list->Append(*CSSIdentifierValue::Create(style.GetTextEmphasisMark()));
+      return list;
+    }
+  }
+  NOTREACHED();
+  return nullptr;
+}
+
+void WebkitTextEmphasisStyle::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetTextEmphasisFill(
+      ComputedStyleInitialValues::InitialTextEmphasisFill());
+  state.Style()->SetTextEmphasisMark(
+      ComputedStyleInitialValues::InitialTextEmphasisMark());
+  state.Style()->SetTextEmphasisCustomMark(
+      ComputedStyleInitialValues::InitialTextEmphasisCustomMark());
+}
+
+void WebkitTextEmphasisStyle::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetTextEmphasisFill(
+      state.ParentStyle()->GetTextEmphasisFill());
+  state.Style()->SetTextEmphasisMark(
+      state.ParentStyle()->GetTextEmphasisMark());
+  state.Style()->SetTextEmphasisCustomMark(
+      state.ParentStyle()->TextEmphasisCustomMark());
+}
+
+void WebkitTextEmphasisStyle::ApplyValue(StyleResolverState& state,
+                                         const CSSValue& value) const {
+  if (const auto* list = DynamicTo<CSSValueList>(value)) {
+    DCHECK_EQ(list->length(), 2U);
+    for (unsigned i = 0; i < 2; ++i) {
+      const auto& ident_value = To<CSSIdentifierValue>(list->Item(i));
+      if (ident_value.GetValueID() == CSSValueID::kFilled ||
+          ident_value.GetValueID() == CSSValueID::kOpen) {
+        state.Style()->SetTextEmphasisFill(
+            ident_value.ConvertTo<TextEmphasisFill>());
+      } else {
+        state.Style()->SetTextEmphasisMark(
+            ident_value.ConvertTo<TextEmphasisMark>());
+      }
+    }
+    state.Style()->SetTextEmphasisCustomMark(g_null_atom);
+    return;
+  }
+
+  if (auto* string_value = DynamicTo<CSSStringValue>(value)) {
+    state.Style()->SetTextEmphasisFill(TextEmphasisFill::kFilled);
+    state.Style()->SetTextEmphasisMark(TextEmphasisMark::kCustom);
+    state.Style()->SetTextEmphasisCustomMark(
+        AtomicString(string_value->Value()));
+    return;
+  }
+
+  const auto& identifier_value = To<CSSIdentifierValue>(value);
+
+  state.Style()->SetTextEmphasisCustomMark(g_null_atom);
+
+  if (identifier_value.GetValueID() == CSSValueID::kFilled ||
+      identifier_value.GetValueID() == CSSValueID::kOpen) {
+    state.Style()->SetTextEmphasisFill(
+        identifier_value.ConvertTo<TextEmphasisFill>());
+    state.Style()->SetTextEmphasisMark(TextEmphasisMark::kAuto);
+  } else {
+    state.Style()->SetTextEmphasisFill(TextEmphasisFill::kFilled);
+    state.Style()->SetTextEmphasisMark(
+        identifier_value.ConvertTo<TextEmphasisMark>());
+  }
+}
+
+const CSSValue* WebkitTextFillColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color WebkitTextFillColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result =
+      visited_link ? style.VisitedLinkTextFillColor() : style.TextFillColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* WebkitTextFillColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(style,
+                                                      style.TextFillColor());
+}
+
+const CSSValue* WebkitTextOrientation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.GetTextOrientation() == ETextOrientation::kMixed)
+    return CSSIdentifierValue::Create(CSSValueID::kVerticalRight);
+  return CSSIdentifierValue::Create(style.GetTextOrientation());
+}
+
+void WebkitTextOrientation::ApplyValue(StyleResolverState& state,
+                                       const CSSValue& value) const {
+  state.SetTextOrientation(
+      To<CSSIdentifierValue>(value).ConvertTo<ETextOrientation>());
+}
+
+const CSSValue* WebkitTextSecurity::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.TextSecurity());
+}
+
+const CSSValue* WebkitTextStrokeColor::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
+}
+
+const blink::Color WebkitTextStrokeColor::ColorIncludingFallback(
+    bool visited_link,
+    const ComputedStyle& style) const {
+  StyleColor result = visited_link ? style.VisitedLinkTextStrokeColor()
+                                   : style.TextStrokeColor();
+  if (!result.IsCurrentColor())
+    return result.GetColor();
+  return visited_link ? style.VisitedLinkColor() : style.GetColor();
+}
+
+const CSSValue* WebkitTextStrokeColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::CurrentColorOrValidColor(style,
+                                                      style.TextStrokeColor());
+}
+
+const CSSValue* WebkitTextStrokeWidth::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLineWidth(
+      range, context.Mode(),
+      css_property_parser_helpers::UnitlessQuirk::kForbid);
+}
+
+const CSSValue* WebkitTextStrokeWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.TextStrokeWidth(), style);
+}
+
+const CSSValue* WebkitTransformOriginX::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
+                                                    CSSValueID::kRight>(
+      range, context.Mode());
+}
+
+const CSSValue* WebkitTransformOriginY::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
+                                                    CSSValueID::kBottom>(
+      range, context.Mode());
+}
+
+const CSSValue* WebkitTransformOriginZ::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
+                                                    kValueRangeAll);
+}
+
+const CSSValue* WebkitUserDrag::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.UserDrag());
+}
+
+const CSSValue* WebkitUserModify::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.UserModify());
+}
+
+const CSSValue* WebkitWritingMode::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetWritingMode());
+}
+
+void WebkitWritingMode::ApplyValue(StyleResolverState& state,
+                                   const CSSValue& value) const {
+  state.SetWritingMode(
+      To<CSSIdentifierValue>(value).ConvertTo<blink::WritingMode>());
+}
+
+const CSSValue* WhiteSpace::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.WhiteSpace());
+}
+
+const CSSValue* Widows::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumePositiveInteger(range);
+}
+
+const CSSValue* Widows::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.Widows(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+const CSSValue* Width::ParseSingleValue(CSSParserTokenRange& range,
+                                        const CSSParserContext& context,
+                                        const CSSParserLocalContext&) const {
+  return css_parsing_utils::ConsumeWidthOrHeight(
+      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
+}
+
+bool Width::IsLayoutDependent(const ComputedStyle* style,
+                              LayoutObject* layout_object) const {
+  return layout_object && (layout_object->IsBox() || layout_object->IsSVG());
+}
+
+const CSSValue* Width::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (ComputedStyleUtils::WidthOrHeightShouldReturnUsedValue(layout_object)) {
+    return ZoomAdjustedPixelValue(
+        ComputedStyleUtils::UsedBoxSize(*layout_object).Width(), style);
+  }
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.Width(),
+                                                             style);
+}
+
+const CSSValue* WillChange::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+
+  CSSValueList* values = CSSValueList::CreateCommaSeparated();
+  // Every comma-separated list of identifiers is a valid will-change value,
+  // unless the list includes an explicitly disallowed identifier.
+  while (true) {
+    if (range.Peek().GetType() != kIdentToken)
+      return nullptr;
+    CSSPropertyID unresolved_property =
+        UnresolvedCSSPropertyID(range.Peek().Value());
+    if (unresolved_property != CSSPropertyID::kInvalid &&
+        unresolved_property != CSSPropertyID::kVariable) {
+#if DCHECK_IS_ON()
+      DCHECK(CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
+                 .IsEnabled());
+#endif
+      // Now "all" is used by both CSSValue and CSSPropertyValue.
+      // Need to return nullptr when currentValue is CSSPropertyID::kAll.
+      if (unresolved_property == CSSPropertyID::kWillChange ||
+          unresolved_property == CSSPropertyID::kAll)
+        return nullptr;
+      values->Append(
+          *MakeGarbageCollected<CSSCustomIdentValue>(unresolved_property));
+      range.ConsumeIncludingWhitespace();
+    } else {
+      switch (range.Peek().Id()) {
+        case CSSValueID::kNone:
+        case CSSValueID::kAll:
+        case CSSValueID::kAuto:
+        case CSSValueID::kDefault:
+        case CSSValueID::kInitial:
+        case CSSValueID::kInherit:
+          return nullptr;
+        case CSSValueID::kContents:
+        case CSSValueID::kScrollPosition:
+          values->Append(*css_property_parser_helpers::ConsumeIdent(range));
+          break;
+        default:
+          range.ConsumeIncludingWhitespace();
+          break;
+      }
+    }
+
+    if (range.AtEnd())
+      break;
+    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range))
+      return nullptr;
+  }
+
+  return values;
+}
+
+const CSSValue* WillChange::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForWillChange(
+      style.WillChangeProperties(), style.WillChangeContents(),
+      style.WillChangeScrollPosition());
+}
+
+void WillChange::ApplyInitial(StyleResolverState& state) const {
+  state.Style()->SetWillChangeContents(false);
+  state.Style()->SetWillChangeScrollPosition(false);
+  state.Style()->SetWillChangeProperties(Vector<CSSPropertyID>());
+  state.Style()->SetSubtreeWillChangeContents(
+      state.ParentStyle()->SubtreeWillChangeContents());
+}
+
+void WillChange::ApplyInherit(StyleResolverState& state) const {
+  state.Style()->SetWillChangeContents(
+      state.ParentStyle()->WillChangeContents());
+  state.Style()->SetWillChangeScrollPosition(
+      state.ParentStyle()->WillChangeScrollPosition());
+  state.Style()->SetWillChangeProperties(
+      state.ParentStyle()->WillChangeProperties());
+  state.Style()->SetSubtreeWillChangeContents(
+      state.ParentStyle()->SubtreeWillChangeContents());
+}
+
+void WillChange::ApplyValue(StyleResolverState& state,
+                            const CSSValue& value) const {
+  bool will_change_contents = false;
+  bool will_change_scroll_position = false;
+  Vector<CSSPropertyID> will_change_properties;
+
+  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kAuto);
+  } else {
+    for (auto& will_change_value : To<CSSValueList>(value)) {
+      if (auto* ident_value =
+              DynamicTo<CSSCustomIdentValue>(will_change_value.Get())) {
+        will_change_properties.push_back(ident_value->ValueAsPropertyID());
+      } else if (To<CSSIdentifierValue>(*will_change_value).GetValueID() ==
+                 CSSValueID::kContents) {
+        will_change_contents = true;
+      } else if (To<CSSIdentifierValue>(*will_change_value).GetValueID() ==
+                 CSSValueID::kScrollPosition) {
+        will_change_scroll_position = true;
+      } else {
+        NOTREACHED();
+      }
+    }
+  }
+  state.Style()->SetWillChangeContents(will_change_contents);
+  state.Style()->SetWillChangeScrollPosition(will_change_scroll_position);
+  state.Style()->SetWillChangeProperties(will_change_properties);
+  state.Style()->SetSubtreeWillChangeContents(
+      will_change_contents || state.ParentStyle()->SubtreeWillChangeContents());
+}
+
+const CSSValue* WordBreak::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.WordBreak());
+}
+
+const CSSValue* WordSpacing::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  return css_parsing_utils::ParseSpacing(range, context);
+}
+
+const CSSValue* WordSpacing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ZoomAdjustedPixelValue(style.WordSpacing(), style);
+}
+
+const CSSValue* WritingMode::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSIdentifierValue::Create(style.GetWritingMode());
+}
+
+void WritingMode::ApplyValue(StyleResolverState& state,
+                             const CSSValue& value) const {
+  state.SetWritingMode(
+      To<CSSIdentifierValue>(value).ConvertTo<blink::WritingMode>());
+}
+
+const CSSValue* X::ParseSingleValue(CSSParserTokenRange& range,
+                                    const CSSParserContext& context,
+                                    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeAll);
+}
+
+const CSSValue* X::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.X(),
+                                                             style);
+}
+
+const CSSValue* Y::ParseSingleValue(CSSParserTokenRange& range,
+                                    const CSSParserContext& context,
+                                    const CSSParserLocalContext&) const {
+  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
+      range, context, kValueRangeAll);
+}
+
+const CSSValue* Y::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle& svg_style,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Y(),
+                                                             style);
+}
+
+const CSSValue* ZIndex::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueID::kAuto)
+    return css_property_parser_helpers::ConsumeIdent(range);
+  return css_property_parser_helpers::ConsumeInteger(range);
+}
+
+const CSSValue* ZIndex::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  if (style.HasAutoZIndex() || !style.IsStackingContext())
+    return CSSIdentifierValue::Create(CSSValueID::kAuto);
+  return CSSPrimitiveValue::Create(style.ZIndex(),
+                                   CSSPrimitiveValue::UnitType::kInteger);
+}
+
+const CSSValue* Zoom::ParseSingleValue(CSSParserTokenRange& range,
+                                       const CSSParserContext& context,
+                                       const CSSParserLocalContext&) const {
+  const CSSParserToken& token = range.Peek();
+  CSSValue* zoom = nullptr;
+  if (token.GetType() == kIdentToken) {
+    zoom =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kNormal>(range);
+  } else {
+    zoom = css_property_parser_helpers::ConsumePercent(range,
+                                                       kValueRangeNonNegative);
+    if (!zoom) {
+      zoom = css_property_parser_helpers::ConsumeNumber(range,
+                                                        kValueRangeNonNegative);
+    }
+  }
+  if (zoom) {
+    if (!(token.Id() == CSSValueID::kNormal ||
+          (token.GetType() == kNumberToken &&
+           To<CSSPrimitiveValue>(zoom)->GetDoubleValue() == 1) ||
+          (token.GetType() == kPercentageToken &&
+           To<CSSPrimitiveValue>(zoom)->GetDoubleValue() == 100)))
+      context.Count(WebFeature::kCSSZoomNotEqualToOne);
+  }
+  return zoom;
+}
+
+const CSSValue* Zoom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return CSSPrimitiveValue::Create(style.Zoom(),
+                                   CSSPrimitiveValue::UnitType::kNumber);
+}
+
+void Zoom::ApplyInitial(StyleResolverState& state) const {
+  state.SetZoom(ComputedStyleInitialValues::InitialZoom());
+}
+
+void Zoom::ApplyInherit(StyleResolverState& state) const {
+  state.SetZoom(state.ParentStyle()->Zoom());
+}
+
+void Zoom::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
+  SECURITY_DCHECK(value.IsPrimitiveValue() || value.IsIdentifierValue());
+
+  if (const auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
+    if (identifier_value->GetValueID() == CSSValueID::kNormal) {
+      state.SetZoom(ComputedStyleInitialValues::InitialZoom());
+    }
+  } else if (const auto* primitive_value =
+                 DynamicTo<CSSPrimitiveValue>(value)) {
+    if (primitive_value->IsPercentage()) {
+      if (float percent = primitive_value->GetFloatValue())
+        state.SetZoom(percent / 100.0f);
+      else
+        state.SetZoom(1.0f);
+    } else if (primitive_value->IsNumber()) {
+      if (float number = primitive_value->GetFloatValue())
+        state.SetZoom(number);
+      else
+        state.SetZoom(1.0f);
+    }
+  }
+}
+
+}  // namespace css_longhand
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_block_end_custom.cc
deleted file mode 100644
index 75e8af0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_block_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginBlockEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_block_start_custom.cc
deleted file mode 100644
index 92934df9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_block_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginBlockStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_bottom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_bottom_custom.cc
deleted file mode 100644
index ed92280..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_bottom_custom.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool MarginBottom::IsLayoutDependent(const ComputedStyle* style,
-                                     LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->MarginBottom().IsFixed());
-}
-
-const CSSValue* MarginBottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& margin_bottom = style.MarginBottom();
-  if (margin_bottom.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_bottom,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginBottom(),
-                                style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_inline_end_custom.cc
deleted file mode 100644
index ac895c4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_inline_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginInlineEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_inline_start_custom.cc
deleted file mode 100644
index 058c503..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_inline_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginInlineStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_left_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_left_custom.cc
deleted file mode 100644
index 24e7d79..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_left_custom.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginLeft::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool MarginLeft::IsLayoutDependent(const ComputedStyle* style,
-                                   LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->MarginLeft().IsFixed());
-}
-
-const CSSValue* MarginLeft::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& margin_left = style.MarginLeft();
-  if (margin_left.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_left,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginLeft(),
-                                style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_right_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_right_custom.cc
deleted file mode 100644
index 6740f711..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_right_custom.cc
+++ /dev/null
@@ -1,63 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool MarginRight::IsLayoutDependent(const ComputedStyle* style,
-                                    LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->MarginRight().IsFixed());
-}
-
-const CSSValue* MarginRight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& margin_right = style.MarginRight();
-  if (margin_right.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_right,
-                                                               style);
-  }
-  float value;
-  if (margin_right.IsPercentOrCalc()) {
-    // LayoutBox gives a marginRight() that is the distance between the
-    // right-edge of the child box and the right-edge of the containing box,
-    // when display == EDisplay::kBlock. Let's calculate the absolute value
-    // of the specified margin-right % instead of relying on LayoutBox's
-    // marginRight() value.
-    value =
-        MinimumValueForLength(
-            margin_right,
-            ToLayoutBox(layout_object)->ContainingBlockLogicalWidthForContent())
-            .ToFloat();
-  } else {
-    value = ToLayoutBox(layout_object)->MarginRight().ToFloat();
-  }
-  return ZoomAdjustedPixelValue(value, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/margin_top_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/margin_top_custom.cc
deleted file mode 100644
index 7cac20e2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/margin_top_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/margin_top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarginTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool MarginTop::IsLayoutDependent(const ComputedStyle* style,
-                                  LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->MarginTop().IsFixed());
-}
-
-const CSSValue* MarginTop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& margin_top = style.MarginTop();
-  if (margin_top.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(margin_top,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(ToLayoutBox(layout_object)->MarginTop(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/marker_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/marker_end_custom.cc
deleted file mode 100644
index 1f76a606..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/marker_end_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/marker_end.h"
-
-#include "third_party/blink/renderer/core/css/css_uri_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarkerEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeUrl(range, &context);
-}
-
-const CSSValue* MarkerEnd::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForSVGResource(svg_style.MarkerEndResource());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/marker_mid_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/marker_mid_custom.cc
deleted file mode 100644
index 8fb3ae9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/marker_mid_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/marker_mid.h"
-
-#include "third_party/blink/renderer/core/css/css_uri_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarkerMid::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeUrl(range, &context);
-}
-
-const CSSValue* MarkerMid::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForSVGResource(svg_style.MarkerMidResource());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/marker_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/marker_start_custom.cc
deleted file mode 100644
index b24d294..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/marker_start_custom.cc
+++ /dev/null
@@ -1,36 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/marker_start.h"
-
-#include "third_party/blink/renderer/core/css/css_uri_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MarkerStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeUrl(range, &context);
-}
-
-const CSSValue* MarkerStart::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForSVGResource(
-      svg_style.MarkerStartResource());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/mask_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/mask_custom.cc
deleted file mode 100644
index 9fc71bd4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/mask_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/mask.h"
-
-#include "third_party/blink/renderer/core/css/css_uri_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Mask::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeUrl(range, &context);
-}
-
-const CSSValue* Mask::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForSVGResource(svg_style.MaskerResource());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/mask_source_type_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/mask_source_type_custom.cc
deleted file mode 100644
index 042b1f9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/mask_source_type_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/mask_source_type.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaskSourceType::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeMaskSourceType, range);
-}
-
-static CSSValue* ValueForFillSourceType(EMaskSourceType type) {
-  switch (type) {
-    case EMaskSourceType::kAlpha:
-      return CSSIdentifierValue::Create(CSSValueID::kAlpha);
-    case EMaskSourceType::kLuminance:
-      return CSSIdentifierValue::Create(CSSValueID::kLuminance);
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
-const CSSValue* MaskSourceType::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  for (const FillLayer* curr_layer = &style.MaskLayers(); curr_layer;
-       curr_layer = curr_layer->Next())
-    list->Append(*ValueForFillSourceType(curr_layer->MaskSourceType()));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/mask_type_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/mask_type_custom.cc
deleted file mode 100644
index ce1c69b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/mask_type_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/mask_type.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaskType::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.MaskType());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/max_block_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/max_block_size_custom.cc
deleted file mode 100644
index caaad31ad7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/max_block_size_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/max_block_size.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaxBlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMaxWidthOrHeight(range, context);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/max_height_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/max_height_custom.cc
deleted file mode 100644
index 72c0f39..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/max_height_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/max_height.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaxHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMaxWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-const CSSValue* MaxHeight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& max_height = style.MaxHeight();
-  if (max_height.IsMaxSizeNone())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(max_height, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/max_inline_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/max_inline_size_custom.cc
deleted file mode 100644
index b0a8c1d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/max_inline_size_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/max_inline_size.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaxInlineSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMaxWidthOrHeight(range, context);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/max_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/max_width_custom.cc
deleted file mode 100644
index 87ee6d0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/max_width_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/max_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MaxWidth::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
-                                           const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeMaxWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-const CSSValue* MaxWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& max_width = style.MaxWidth();
-  if (max_width.IsMaxSizeNone())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(max_width, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/min_block_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/min_block_size_custom.cc
deleted file mode 100644
index b5b6278..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/min_block_size_custom.cc
+++ /dev/null
@@ -1,21 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/min_block_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MinBlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/min_height_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/min_height_custom.cc
deleted file mode 100644
index 0f91093..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/min_height_custom.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/min_height.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* MinHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-const CSSValue* MinHeight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.MinHeight().IsAuto())
-    return ComputedStyleUtils::MinWidthOrMinHeightAuto(styled_node, style);
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.MinHeight(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/min_inline_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/min_inline_size_custom.cc
deleted file mode 100644
index 3f207f0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/min_inline_size_custom.cc
+++ /dev/null
@@ -1,21 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/min_inline_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MinInlineSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/min_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/min_width_custom.cc
deleted file mode 100644
index a332e0a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/min_width_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/min_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* MinWidth::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
-                                           const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-const CSSValue* MinWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.MinWidth().IsAuto())
-    return ComputedStyleUtils::MinWidthOrMinHeightAuto(styled_node, style);
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.MinWidth(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/mix_blend_mode_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/mix_blend_mode_custom.cc
deleted file mode 100644
index 601297a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/mix_blend_mode_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/mix_blend_mode.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* MixBlendMode::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetBlendMode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/object_fit_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/object_fit_custom.cc
deleted file mode 100644
index 13856d7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/object_fit_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/object_fit.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ObjectFit::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetObjectFit());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/object_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/object_position_custom.cc
deleted file mode 100644
index 25edd43..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/object_position_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/object_position.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ObjectPosition::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumePosition(range, context,
-                         css_property_parser_helpers::UnitlessQuirk::kForbid,
-                         base::Optional<WebFeature>());
-}
-
-const CSSValue* ObjectPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return MakeGarbageCollected<CSSValuePair>(
-      ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-          style.ObjectPosition().X(), style),
-      ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-          style.ObjectPosition().Y(), style),
-      CSSValuePair::kKeepIdenticalValues);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/offset_anchor_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/offset_anchor_custom.cc
deleted file mode 100644
index 61913de..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/offset_anchor_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/offset_anchor.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-using namespace css_property_parser_helpers;
-
-const CSSValue* OffsetAnchor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kAuto)
-    return ConsumeIdent(range);
-  return ConsumePosition(range, context, UnitlessQuirk::kForbid,
-                         base::Optional<WebFeature>());
-}
-
-const CSSValue* OffsetAnchor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPosition(style.OffsetAnchor(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/offset_distance_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/offset_distance_custom.cc
deleted file mode 100644
index fe0f5b0f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/offset_distance_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/offset_distance.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OffsetDistance::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeAll);
-}
-
-const CSSValue* OffsetDistance::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.OffsetDistance(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/offset_path_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/offset_path_custom.cc
deleted file mode 100644
index e39339d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/offset_path_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/offset_path.h"
-
-#include "third_party/blink/renderer/core/css/basic_shape_functions.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OffsetPath::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeOffsetPath(range, context);
-}
-
-const CSSValue* OffsetPath::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  if (const BasicShape* style_motion_path = style.OffsetPath())
-    return ValueForBasicShape(style, style_motion_path);
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/offset_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/offset_position_custom.cc
deleted file mode 100644
index 5f9dcf7f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/offset_position_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/offset_position.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/frame/use_counter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-using namespace css_property_parser_helpers;
-
-const CSSValue* OffsetPosition::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kAuto)
-    return ConsumeIdent(range);
-  CSSValue* value = ConsumePosition(range, context, UnitlessQuirk::kForbid,
-                                    base::Optional<WebFeature>());
-
-  // Count when we receive a valid position other than 'auto'.
-  if (value && value->IsValuePair())
-    context.Count(WebFeature::kCSSOffsetInEffect);
-  return value;
-}
-
-const CSSValue* OffsetPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPosition(style.OffsetPosition(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/offset_rotate_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/offset_rotate_custom.cc
deleted file mode 100644
index 066f4dd..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/offset_rotate_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/offset_rotate.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OffsetRotate::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeOffsetRotate(range, context);
-}
-const CSSValue* OffsetRotate::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (style.OffsetRotate().type == OffsetRotationType::kAuto)
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kAuto));
-  list->Append(*CSSPrimitiveValue::Create(
-      style.OffsetRotate().angle, CSSPrimitiveValue::UnitType::kDegrees));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/opacity_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/opacity_custom.cc
deleted file mode 100644
index 39e52b6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/opacity_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/opacity.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Opacity::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* Opacity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.Opacity(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/order_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/order_custom.cc
deleted file mode 100644
index b8e95bf..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/order_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/order.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Order::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeInteger(range);
-}
-
-const CSSValue* Order::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.Order(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/orphans_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/orphans_custom.cc
deleted file mode 100644
index 468c68c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/orphans_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/orphans.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Orphans::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumePositiveInteger(range);
-}
-
-const CSSValue* Orphans::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.Orphans(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/outline_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/outline_color_custom.cc
deleted file mode 100644
index 09e55f8..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/outline_color_custom.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/outline_color.h"
-
-#include "third_party/blink/renderer/core/css/css_color_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OutlineColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // Allow the special focus color even in HTML Standard parsing mode.
-  if (range.Peek().Id() == CSSValueID::kWebkitFocusRingColor)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color OutlineColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result =
-      visited_link ? style.VisitedLinkOutlineColor() : style.OutlineColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* OutlineColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return allow_visited_style ? cssvalue::CSSColorValue::Create(
-                                   style.VisitedDependentColor(*this).Rgb())
-                             : ComputedStyleUtils::CurrentColorOrValidColor(
-                                   style, style.OutlineColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/outline_offset_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/outline_offset_custom.cc
deleted file mode 100644
index a83f5a13..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/outline_offset_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/outline_offset.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OutlineOffset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeAll);
-}
-
-const CSSValue* OutlineOffset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.OutlineOffset(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/outline_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/outline_style_custom.cc
deleted file mode 100644
index c04527c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/outline_style_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/outline_style.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OutlineStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.OutlineStyleIsAuto())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return CSSIdentifierValue::Create(style.OutlineStyle());
-}
-
-void OutlineStyle::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetOutlineStyleIsAuto(
-      ComputedStyleInitialValues::InitialOutlineStyleIsAuto());
-  state.Style()->SetOutlineStyle(EBorderStyle::kNone);
-}
-
-void OutlineStyle::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetOutlineStyleIsAuto(
-      state.ParentStyle()->OutlineStyleIsAuto());
-  state.Style()->SetOutlineStyle(state.ParentStyle()->OutlineStyle());
-}
-
-void OutlineStyle::ApplyValue(StyleResolverState& state,
-                              const CSSValue& value) const {
-  const auto& identifier_value = To<CSSIdentifierValue>(value);
-  state.Style()->SetOutlineStyleIsAuto(
-      static_cast<bool>(identifier_value.ConvertTo<OutlineIsAuto>()));
-  state.Style()->SetOutlineStyle(identifier_value.ConvertTo<EBorderStyle>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/outline_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/outline_width_custom.cc
deleted file mode 100644
index ce38ee0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/outline_width_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/outline_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OutlineWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLineWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* OutlineWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.OutlineWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overflow_anchor_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overflow_anchor_custom.cc
deleted file mode 100644
index 7bd0665..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overflow_anchor_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overflow_anchor.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverflowAnchor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverflowAnchor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overflow_wrap_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overflow_wrap_custom.cc
deleted file mode 100644
index 9bf7fe5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overflow_wrap_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overflow_wrap.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverflowWrap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverflowWrap());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overflow_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overflow_x_custom.cc
deleted file mode 100644
index 46213f1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overflow_x_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overflow_x.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverflowX::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverflowX());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overflow_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overflow_y_custom.cc
deleted file mode 100644
index f006aee..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overflow_y_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overflow_y.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverflowY::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverflowY());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_x_custom.cc
deleted file mode 100644
index 257dd525..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_x_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_x.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverscrollBehaviorX::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverscrollBehaviorX());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_y_custom.cc
deleted file mode 100644
index 69800af..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_y_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/overscroll_behavior_y.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* OverscrollBehaviorY::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.OverscrollBehaviorY());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_block_end_custom.cc
deleted file mode 100644
index 499c6ea..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_block_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingBlockEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_block_start_custom.cc
deleted file mode 100644
index ebfbe2bc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_block_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingBlockStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_bottom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_bottom_custom.cc
deleted file mode 100644
index 9154c408..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_bottom_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool PaddingBottom::IsLayoutDependent(const ComputedStyle* style,
-                                      LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->PaddingBottom().IsFixed());
-}
-
-const CSSValue* PaddingBottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& padding_bottom = style.PaddingBottom();
-  if (padding_bottom.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_bottom,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(
-      ToLayoutBox(layout_object)->ComputedCSSPaddingBottom(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_inline_end_custom.cc
deleted file mode 100644
index 714efdb9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_inline_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingInlineEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_inline_start_custom.cc
deleted file mode 100644
index 5e9e128..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_inline_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingInlineStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_left_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_left_custom.cc
deleted file mode 100644
index 9620b07..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_left_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingLeft::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool PaddingLeft::IsLayoutDependent(const ComputedStyle* style,
-                                    LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->PaddingLeft().IsFixed());
-}
-
-const CSSValue* PaddingLeft::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& padding_left = style.PaddingLeft();
-  if (padding_left.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_left,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(
-      ToLayoutBox(layout_object)->ComputedCSSPaddingLeft(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_right_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_right_custom.cc
deleted file mode 100644
index 848f041..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_right_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool PaddingRight::IsLayoutDependent(const ComputedStyle* style,
-                                     LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->PaddingRight().IsFixed());
-}
-
-const CSSValue* PaddingRight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& padding_right = style.PaddingRight();
-  if (padding_right.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_right,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(
-      ToLayoutBox(layout_object)->ComputedCSSPaddingRight(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/padding_top_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/padding_top_custom.cc
deleted file mode 100644
index 4624004..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/padding_top_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/padding_top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaddingTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool PaddingTop::IsLayoutDependent(const ComputedStyle* style,
-                                   LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->PaddingTop().IsFixed());
-}
-
-const CSSValue* PaddingTop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& padding_top = style.PaddingTop();
-  if (padding_top.IsFixed() || !layout_object || !layout_object->IsBox()) {
-    return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(padding_top,
-                                                               style);
-  }
-  return ZoomAdjustedPixelValue(
-      ToLayoutBox(layout_object)->ComputedCSSPaddingTop(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/page_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/page_custom.cc
deleted file mode 100644
index 873d8d18..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/page_custom.cc
+++ /dev/null
@@ -1,21 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/page.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Page::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeCustomIdent(range, context);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/paint_order_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/paint_order_custom.cc
deleted file mode 100644
index 3ac43b7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/paint_order_custom.cc
+++ /dev/null
@@ -1,106 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/paint_order.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PaintOrder::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNormal)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  Vector<CSSValueID, 3> paint_type_list;
-  CSSIdentifierValue* fill = nullptr;
-  CSSIdentifierValue* stroke = nullptr;
-  CSSIdentifierValue* markers = nullptr;
-  do {
-    CSSValueID id = range.Peek().Id();
-    if (id == CSSValueID::kFill && !fill)
-      fill = css_property_parser_helpers::ConsumeIdent(range);
-    else if (id == CSSValueID::kStroke && !stroke)
-      stroke = css_property_parser_helpers::ConsumeIdent(range);
-    else if (id == CSSValueID::kMarkers && !markers)
-      markers = css_property_parser_helpers::ConsumeIdent(range);
-    else
-      return nullptr;
-    paint_type_list.push_back(id);
-  } while (!range.AtEnd());
-
-  // After parsing we serialize the paint-order list. Since it is not possible
-  // to pop a last list items from CSSValueList without bigger cost, we create
-  // the list after parsing.
-  CSSValueID first_paint_order_type = paint_type_list.at(0);
-  CSSValueList* paint_order_list = CSSValueList::CreateSpaceSeparated();
-  switch (first_paint_order_type) {
-    case CSSValueID::kFill:
-    case CSSValueID::kStroke:
-      paint_order_list->Append(
-          first_paint_order_type == CSSValueID::kFill ? *fill : *stroke);
-      if (paint_type_list.size() > 1) {
-        if (paint_type_list.at(1) == CSSValueID::kMarkers)
-          paint_order_list->Append(*markers);
-      }
-      break;
-    case CSSValueID::kMarkers:
-      paint_order_list->Append(*markers);
-      if (paint_type_list.size() > 1) {
-        if (paint_type_list.at(1) == CSSValueID::kStroke)
-          paint_order_list->Append(*stroke);
-      }
-      break;
-    default:
-      NOTREACHED();
-  }
-
-  return paint_order_list;
-}
-
-const CSSValue* PaintOrder::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const EPaintOrder paint_order = svg_style.PaintOrder();
-  if (paint_order == kPaintOrderNormal)
-    return CSSIdentifierValue::Create(CSSValueID::kNormal);
-
-  // Table mapping to the shortest (canonical) form of the property.
-  //
-  // Per spec, if any keyword is omitted it will be added last using
-  // the standard ordering. So "stroke" implies an order "stroke fill
-  // markers" etc. From a serialization PoV this means we never need
-  // to emit the last keyword.
-  //
-  // https://svgwg.org/svg2-draft/painting.html#PaintOrder
-  static const uint8_t canonical_form[][2] = {
-      // kPaintOrderNormal is handled above.
-      {PT_FILL, PT_NONE},       // kPaintOrderFillStrokeMarkers
-      {PT_FILL, PT_MARKERS},    // kPaintOrderFillMarkersStroke
-      {PT_STROKE, PT_NONE},     // kPaintOrderStrokeFillMarkers
-      {PT_STROKE, PT_MARKERS},  // kPaintOrderStrokeMarkersFill
-      {PT_MARKERS, PT_NONE},    // kPaintOrderMarkersFillStroke
-      {PT_MARKERS, PT_STROKE},  // kPaintOrderMarkersStrokeFill
-  };
-  DCHECK_LT(static_cast<size_t>(paint_order) - 1, base::size(canonical_form));
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  for (const auto& keyword : canonical_form[paint_order - 1]) {
-    const auto paint_order_type = static_cast<EPaintOrderType>(keyword);
-    if (paint_order_type == PT_NONE)
-      break;
-    list->Append(*CSSIdentifierValue::Create(paint_order_type));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/perspective_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/perspective_custom.cc
deleted file mode 100644
index 4772fb61..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/perspective_custom.cc
+++ /dev/null
@@ -1,52 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/perspective.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-#include "third_party/blink/renderer/core/frame/use_counter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Perspective::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& localContext) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  CSSPrimitiveValue* parsed_value = css_property_parser_helpers::ConsumeLength(
-      range, context.Mode(), kValueRangeAll);
-  bool use_legacy_parsing = localContext.UseAliasParsing();
-  if (!parsed_value && use_legacy_parsing) {
-    double perspective;
-    if (!css_property_parser_helpers::ConsumeNumberRaw(range, perspective))
-      return nullptr;
-    context.Count(WebFeature::kUnitlessPerspectiveInPerspectiveProperty);
-    parsed_value = CSSPrimitiveValue::Create(
-        perspective, CSSPrimitiveValue::UnitType::kPixels);
-  }
-  if (parsed_value &&
-      (parsed_value->IsCalculated() || parsed_value->GetDoubleValue() > 0))
-    return parsed_value;
-  return nullptr;
-}
-
-const CSSValue* Perspective::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.HasPerspective())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return ZoomAdjustedPixelValue(style.Perspective(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/perspective_origin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/perspective_origin_custom.cc
deleted file mode 100644
index 49d7747..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/perspective_origin_custom.cc
+++ /dev/null
@@ -1,62 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/perspective_origin.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PerspectiveOrigin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumePosition(range, context,
-                         css_property_parser_helpers::UnitlessQuirk::kForbid,
-                         base::Optional<WebFeature>());
-}
-
-bool PerspectiveOrigin::IsLayoutDependent(const ComputedStyle* style,
-                                          LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* PerspectiveOrigin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (layout_object) {
-    LayoutRect box;
-    if (layout_object->IsBox())
-      box = ToLayoutBox(layout_object)->BorderBoxRect();
-
-    return MakeGarbageCollected<CSSValuePair>(
-        ZoomAdjustedPixelValue(
-            MinimumValueForLength(style.PerspectiveOriginX(), box.Width()),
-            style),
-        ZoomAdjustedPixelValue(
-            MinimumValueForLength(style.PerspectiveOriginY(), box.Height()),
-            style),
-        CSSValuePair::kKeepIdenticalValues);
-  } else {
-    return MakeGarbageCollected<CSSValuePair>(
-        ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-            style.PerspectiveOriginX(), style),
-        ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-            style.PerspectiveOriginY(), style),
-        CSSValuePair::kKeepIdenticalValues);
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/pointer_events_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/pointer_events_custom.cc
deleted file mode 100644
index f7b56248..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/pointer_events_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/pointer_events.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* PointerEvents::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.PointerEvents());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/position_custom.cc
deleted file mode 100644
index 68fc098a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/position_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/position.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Position::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetPosition());
-}
-
-void Position::ApplyInherit(StyleResolverState& state) const {
-  if (!state.ParentNode()->IsDocumentNode())
-    state.Style()->SetPosition(state.ParentStyle()->GetPosition());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/quotes_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/quotes_custom.cc
deleted file mode 100644
index de9a3119..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/quotes_custom.cc
+++ /dev/null
@@ -1,59 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/quotes.h"
-
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Quotes::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  CSSValueList* values = CSSValueList::CreateSpaceSeparated();
-  while (!range.AtEnd()) {
-    CSSStringValue* parsed_value =
-        css_property_parser_helpers::ConsumeString(range);
-    if (!parsed_value)
-      return nullptr;
-    values->Append(*parsed_value);
-  }
-  if (values->length() && values->length() % 2 == 0)
-    return values;
-  return nullptr;
-}
-
-const CSSValue* Quotes::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.Quotes()) {
-    // TODO(ramya.v): We should return the quote values that we're actually
-    // using.
-    return nullptr;
-  }
-  if (style.Quotes()->size()) {
-    CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-    for (int i = 0; i < style.Quotes()->size(); i++) {
-      list->Append(*MakeGarbageCollected<CSSStringValue>(
-          style.Quotes()->GetOpenQuote(i)));
-      list->Append(*MakeGarbageCollected<CSSStringValue>(
-          style.Quotes()->GetCloseQuote(i)));
-    }
-    return list;
-  }
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/r_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/r_custom.cc
deleted file mode 100644
index 7f3111a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/r_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/r.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* R::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext& context,
-                                    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeNonNegative);
-}
-
-const CSSValue* R::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.R(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc
deleted file mode 100644
index 72362e30..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/resize_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/resize.h"
-
-#include "third_party/blink/renderer/core/frame/settings.h"
-#include "third_party/blink/renderer/core/frame/use_counter.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Resize::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Resize());
-}
-
-void Resize::ApplyValue(StyleResolverState& state,
-                        const CSSValue& value) const {
-  const CSSIdentifierValue& identifier_value = To<CSSIdentifierValue>(value);
-
-  EResize r = EResize::kNone;
-  if (identifier_value.GetValueID() == CSSValueID::kAuto) {
-    if (Settings* settings = state.GetDocument().GetSettings()) {
-      r = settings->GetTextAreasAreResizable() ? EResize::kBoth
-                                               : EResize::kNone;
-    }
-    UseCounter::Count(state.GetDocument(), WebFeature::kCSSResizeAuto);
-  } else {
-    r = identifier_value.ConvertTo<EResize>();
-  }
-  state.Style()->SetResize(r);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/right_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/right_custom.cc
deleted file mode 100644
index 55e234c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/right_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* Right::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_parsing_utils::UnitlessUnlessShorthand(local_context));
-}
-
-bool Right::IsLayoutDependent(const ComputedStyle* style,
-                              LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* Right::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
-                                                    layout_object);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/rotate_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/rotate_custom.cc
deleted file mode 100644
index 96facc06..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/rotate_custom.cc
+++ /dev/null
@@ -1,73 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/rotate.h"
-
-#include "third_party/blink/renderer/core/css/css_axis_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Rotate::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
-
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-
-  CSSValue* rotation = css_property_parser_helpers::ConsumeAngle(
-      range, &context, base::Optional<WebFeature>());
-
-  CSSValue* axis = css_property_parser_helpers::ConsumeAxis(range);
-  if (axis)
-    list->Append(*axis);
-  else if (!rotation)
-    return nullptr;
-
-  if (!rotation) {
-    rotation = css_property_parser_helpers::ConsumeAngle(
-        range, &context, base::Optional<WebFeature>());
-    if (!rotation)
-      return nullptr;
-  }
-  list->Append(*rotation);
-
-  return list;
-}
-
-const CSSValue* Rotate::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.Rotate())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (style.Rotate()->X() != 0 || style.Rotate()->Y() != 0 ||
-      style.Rotate()->Z() != 1) {
-    list->Append(*CSSPrimitiveValue::Create(
-        style.Rotate()->X(), CSSPrimitiveValue::UnitType::kNumber));
-    list->Append(*CSSPrimitiveValue::Create(
-        style.Rotate()->Y(), CSSPrimitiveValue::UnitType::kNumber));
-    list->Append(*CSSPrimitiveValue::Create(
-        style.Rotate()->Z(), CSSPrimitiveValue::UnitType::kNumber));
-  }
-  list->Append(*CSSPrimitiveValue::Create(
-      style.Rotate()->Angle(), CSSPrimitiveValue::UnitType::kDegrees));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/row_gap_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/row_gap_custom.cc
deleted file mode 100644
index 5b5c1df1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/row_gap_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/row_gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* RowGap::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeGapLength(range, context);
-}
-
-const CSSValue* RowGap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool) const {
-  return ComputedStyleUtils::ValueForGapLength(style.RowGap(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/rx_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/rx_custom.cc
deleted file mode 100644
index ef60309..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/rx_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/rx.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Rx::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeNonNegative);
-}
-
-const CSSValue* Rx::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Rx(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/ry_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/ry_custom.cc
deleted file mode 100644
index deeb9f5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/ry_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/ry.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Ry::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeNonNegative);
-}
-
-const CSSValue* Ry::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Ry(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scale_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scale_custom.cc
deleted file mode 100644
index e99ad9d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scale_custom.cc
+++ /dev/null
@@ -1,62 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scale.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Scale::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
-
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValue* scale =
-      css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-  if (!scale)
-    return nullptr;
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*scale);
-  scale = css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-  if (scale) {
-    list->Append(*scale);
-    scale = css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-    if (scale)
-      list->Append(*scale);
-  }
-
-  return list;
-}
-
-const CSSValue* Scale::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.Scale())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*CSSPrimitiveValue::Create(
-      style.Scale()->X(), CSSPrimitiveValue::UnitType::kNumber));
-  list->Append(*CSSPrimitiveValue::Create(
-      style.Scale()->Y(), CSSPrimitiveValue::UnitType::kNumber));
-  if (style.Scale()->Z() != 1) {
-    list->Append(*CSSPrimitiveValue::Create(
-        style.Scale()->Z(), CSSPrimitiveValue::UnitType::kNumber));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_behavior_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_behavior_custom.cc
deleted file mode 100644
index ece75e0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_behavior_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_behavior.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollBehavior::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetScrollBehavior());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_customization_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_customization_custom.cc
deleted file mode 100644
index a9b303f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_customization_custom.cc
+++ /dev/null
@@ -1,74 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_customization.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-class CSSParserLocalContext;
-namespace blink {
-
-namespace {
-
-static bool ConsumePan(CSSParserTokenRange& range,
-                       CSSValue** pan_x,
-                       CSSValue** pan_y) {
-  CSSValueID id = range.Peek().Id();
-  if ((id == CSSValueID::kPanX || id == CSSValueID::kPanRight ||
-       id == CSSValueID::kPanLeft) &&
-      !*pan_x) {
-    *pan_x = css_property_parser_helpers::ConsumeIdent(range);
-  } else if ((id == CSSValueID::kPanY || id == CSSValueID::kPanDown ||
-              id == CSSValueID::kPanUp) &&
-             !*pan_y) {
-    *pan_y = css_property_parser_helpers::ConsumeIdent(range);
-  } else {
-    return false;
-  }
-  return true;
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* ScrollCustomization::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kAuto || id == CSSValueID::kNone) {
-    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
-    return list;
-  }
-
-  CSSValue* pan_x = nullptr;
-  CSSValue* pan_y = nullptr;
-  if (!ConsumePan(range, &pan_x, &pan_y))
-    return nullptr;
-  if (!range.AtEnd() && !ConsumePan(range, &pan_x, &pan_y))
-    return nullptr;
-
-  if (pan_x)
-    list->Append(*pan_x);
-  if (pan_y)
-    list->Append(*pan_y);
-  return list;
-}
-
-const CSSValue* ScrollCustomization::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ScrollCustomizationFlagsToCSSValue(
-      style.ScrollCustomization());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_end_custom.cc
deleted file mode 100644
index a835df3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_end_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginBlockEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_start_custom.cc
deleted file mode 100644
index 472e5b7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_start_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginBlockStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_bottom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_bottom_custom.cc
deleted file mode 100644
index 978ebde..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_bottom_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollMarginBottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.ScrollMarginBottom(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_end_custom.cc
deleted file mode 100644
index 7f17fd3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_end_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginInlineEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_start_custom.cc
deleted file mode 100644
index cab85ff..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_start_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginInlineStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_left_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_left_custom.cc
deleted file mode 100644
index a7fe021..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_left_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginLeft::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollMarginLeft::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.ScrollMarginLeft(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_right_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_right_custom.cc
deleted file mode 100644
index 9769d15..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_right_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollMarginRight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.ScrollMarginRight(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_top_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_top_custom.cc
deleted file mode 100644
index 5a9a4d4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_margin_top_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_margin_top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollMarginTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollMarginTop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.ScrollMarginTop(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_end_custom.cc
deleted file mode 100644
index d4d9484..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingBlockEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_start_custom.cc
deleted file mode 100644
index 1a2ae5d0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingBlockStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_bottom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_bottom_custom.cc
deleted file mode 100644
index fbce2ba..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_bottom_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollPaddingBottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.ScrollPaddingBottom(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_end_custom.cc
deleted file mode 100644
index 9bb8dd6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_end_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingInlineEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_start_custom.cc
deleted file mode 100644
index ee82bf5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_start_custom.cc
+++ /dev/null
@@ -1,25 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingInlineStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_left_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_left_custom.cc
deleted file mode 100644
index d0a38cc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_left_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingLeft::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollPaddingLeft::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.ScrollPaddingLeft(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_right_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_right_custom.cc
deleted file mode 100644
index 987d1dc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_right_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollPaddingRight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.ScrollPaddingRight(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_top_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_top_custom.cc
deleted file mode 100644
index 6636efca..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_padding_top_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_padding_top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollPaddingTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* ScrollPaddingTop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.ScrollPaddingTop(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_align_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_align_custom.cc
deleted file mode 100644
index 2b3fb4b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_align_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_align.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollSnapAlign::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValue* block_value = css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kNone, CSSValueID::kStart, CSSValueID::kEnd,
-      CSSValueID::kCenter>(range);
-  if (!block_value)
-    return nullptr;
-  if (range.AtEnd())
-    return block_value;
-
-  CSSValue* inline_value = css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kNone, CSSValueID::kStart, CSSValueID::kEnd,
-      CSSValueID::kCenter>(range);
-  if (!inline_value)
-    return block_value;
-  auto* pair = MakeGarbageCollected<CSSValuePair>(
-      block_value, inline_value, CSSValuePair::kDropIdenticalValues);
-  return pair;
-}
-
-const CSSValue* ScrollSnapAlign::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForScrollSnapAlign(style.GetScrollSnapAlign(),
-                                                     style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_stop_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_stop_custom.cc
deleted file mode 100644
index 38b7955..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_stop_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_stop.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollSnapStop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.ScrollSnapStop());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_type_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_type_custom.cc
deleted file mode 100644
index 52b381d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/scroll_snap_type_custom.cc
+++ /dev/null
@@ -1,49 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/scroll_snap_type.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ScrollSnapType::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID axis_id = range.Peek().Id();
-  if (axis_id != CSSValueID::kNone && axis_id != CSSValueID::kX &&
-      axis_id != CSSValueID::kY && axis_id != CSSValueID::kBlock &&
-      axis_id != CSSValueID::kInline && axis_id != CSSValueID::kBoth)
-    return nullptr;
-  CSSValue* axis_value = css_property_parser_helpers::ConsumeIdent(range);
-  if (range.AtEnd() || axis_id == CSSValueID::kNone)
-    return axis_value;
-
-  CSSValueID strictness_id = range.Peek().Id();
-  if (strictness_id != CSSValueID::kProximity &&
-      strictness_id != CSSValueID::kMandatory)
-    return axis_value;
-  CSSValue* strictness_value = css_property_parser_helpers::ConsumeIdent(range);
-  auto* pair = MakeGarbageCollected<CSSValuePair>(
-      axis_value, strictness_value, CSSValuePair::kDropIdenticalValues);
-  return pair;
-}
-
-const CSSValue* ScrollSnapType::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForScrollSnapType(style.GetScrollSnapType(),
-                                                    style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/shape_image_threshold_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/shape_image_threshold_custom.cc
deleted file mode 100644
index b9a90b4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/shape_image_threshold_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/shape_image_threshold.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ShapeImageThreshold::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* ShapeImageThreshold::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.ShapeImageThreshold(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/shape_margin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/shape_margin_custom.cc
deleted file mode 100644
index a541cd5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/shape_margin_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/shape_margin.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ShapeMargin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative);
-}
-
-const CSSValue* ShapeMargin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return CSSValue::Create(style.ShapeMargin(), style.EffectiveZoom());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/shape_outside_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/shape_outside_custom.cc
deleted file mode 100644
index 27434eaa..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/shape_outside_custom.cc
+++ /dev/null
@@ -1,51 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/shape_outside.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-using namespace css_property_parser_helpers;
-
-const CSSValue* ShapeOutside::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (CSSValue* image_value = ConsumeImageOrNone(range, &context))
-    return image_value;
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (CSSValue* box_value = ConsumeShapeBox(range))
-    list->Append(*box_value);
-  if (CSSValue* shape_value =
-          css_parsing_utils::ConsumeBasicShape(range, context)) {
-    list->Append(*shape_value);
-    if (list->length() < 2) {
-      if (CSSValue* box_value = ConsumeShapeBox(range))
-        list->Append(*box_value);
-    }
-  }
-  if (!list->length())
-    return nullptr;
-  return list;
-}
-
-const CSSValue* ShapeOutside::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForShape(style, style.ShapeOutside());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/shape_rendering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/shape_rendering_custom.cc
deleted file mode 100644
index 707fc51..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/shape_rendering_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/shape_rendering.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ShapeRendering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.ShapeRendering());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/size_custom.cc
deleted file mode 100644
index 0443ed5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/size_custom.cc
+++ /dev/null
@@ -1,156 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/size.h"
-
-#include "third_party/blink/renderer/core/css/css_resolution_units.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_longhand {
-
-static CSSValue* ConsumePageSize(CSSParserTokenRange& range) {
-  return css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kA3, CSSValueID::kA4, CSSValueID::kA5, CSSValueID::kB4,
-      CSSValueID::kB5, CSSValueID::kLedger, CSSValueID::kLegal,
-      CSSValueID::kLetter>(range);
-}
-
-static float MmToPx(float mm) {
-  return mm * kCssPixelsPerMillimeter;
-}
-static float InchToPx(float inch) {
-  return inch * kCssPixelsPerInch;
-}
-static FloatSize GetPageSizeFromName(const CSSIdentifierValue& page_size_name) {
-  switch (page_size_name.GetValueID()) {
-    case CSSValueID::kA5:
-      return FloatSize(MmToPx(148), MmToPx(210));
-    case CSSValueID::kA4:
-      return FloatSize(MmToPx(210), MmToPx(297));
-    case CSSValueID::kA3:
-      return FloatSize(MmToPx(297), MmToPx(420));
-    case CSSValueID::kB5:
-      return FloatSize(MmToPx(176), MmToPx(250));
-    case CSSValueID::kB4:
-      return FloatSize(MmToPx(250), MmToPx(353));
-    case CSSValueID::kLetter:
-      return FloatSize(InchToPx(8.5), InchToPx(11));
-    case CSSValueID::kLegal:
-      return FloatSize(InchToPx(8.5), InchToPx(14));
-    case CSSValueID::kLedger:
-      return FloatSize(InchToPx(11), InchToPx(17));
-    default:
-      NOTREACHED();
-      return FloatSize(0, 0);
-  }
-}
-
-const CSSValue* Size::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  CSSValueList* result = CSSValueList::CreateSpaceSeparated();
-
-  if (range.Peek().Id() == CSSValueID::kAuto) {
-    result->Append(*css_property_parser_helpers::ConsumeIdent(range));
-    return result;
-  }
-
-  if (CSSValue* width = css_property_parser_helpers::ConsumeLength(
-          range, context.Mode(), kValueRangeNonNegative)) {
-    CSSValue* height = css_property_parser_helpers::ConsumeLength(
-        range, context.Mode(), kValueRangeNonNegative);
-    result->Append(*width);
-    if (height)
-      result->Append(*height);
-    return result;
-  }
-
-  CSSValue* page_size = ConsumePageSize(range);
-  CSSValue* orientation =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kPortrait,
-                                                CSSValueID::kLandscape>(range);
-  if (!page_size)
-    page_size = ConsumePageSize(range);
-
-  if (!orientation && !page_size)
-    return nullptr;
-  if (page_size)
-    result->Append(*page_size);
-  if (orientation)
-    result->Append(*orientation);
-  return result;
-}
-
-void Size::ApplyInitial(StyleResolverState& state) const {}
-
-void Size::ApplyInherit(StyleResolverState& state) const {}
-
-void Size::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
-  state.Style()->ResetPageSizeType();
-  FloatSize size;
-  EPageSizeType page_size_type = EPageSizeType::kAuto;
-  const auto& list = To<CSSValueList>(value);
-  if (list.length() == 2) {
-    // <length>{2} | <page-size> <orientation>
-    const CSSValue& first = list.Item(0);
-    const CSSValue& second = list.Item(1);
-    auto* first_primitive_value = DynamicTo<CSSPrimitiveValue>(first);
-    if (first_primitive_value && first_primitive_value->IsLength()) {
-      // <length>{2}
-      size = FloatSize(
-          first_primitive_value->ComputeLength<float>(
-              state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0)),
-          To<CSSPrimitiveValue>(second).ComputeLength<float>(
-              state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0)));
-    } else {
-      // <page-size> <orientation>
-      size = GetPageSizeFromName(To<CSSIdentifierValue>(first));
-
-      DCHECK(To<CSSIdentifierValue>(second).GetValueID() ==
-                 CSSValueID::kLandscape ||
-             To<CSSIdentifierValue>(second).GetValueID() ==
-                 CSSValueID::kPortrait);
-      if (To<CSSIdentifierValue>(second).GetValueID() == CSSValueID::kLandscape)
-        size = size.TransposedSize();
-    }
-    page_size_type = EPageSizeType::kResolved;
-  } else {
-    DCHECK_EQ(list.length(), 1U);
-    // <length> | auto | <page-size> | [ portrait | landscape]
-    const CSSValue& first = list.Item(0);
-    auto* first_primitive_value = DynamicTo<CSSPrimitiveValue>(first);
-    if (first_primitive_value && first_primitive_value->IsLength()) {
-      // <length>
-      page_size_type = EPageSizeType::kResolved;
-      float width = first_primitive_value->ComputeLength<float>(
-          state.CssToLengthConversionData().CopyWithAdjustedZoom(1.0));
-      size = FloatSize(width, width);
-    } else {
-      const auto& ident = To<CSSIdentifierValue>(first);
-      switch (ident.GetValueID()) {
-        case CSSValueID::kAuto:
-          page_size_type = EPageSizeType::kAuto;
-          break;
-        case CSSValueID::kPortrait:
-          page_size_type = EPageSizeType::kPortrait;
-          break;
-        case CSSValueID::kLandscape:
-          page_size_type = EPageSizeType::kLandscape;
-          break;
-        default:
-          // <page-size>
-          page_size_type = EPageSizeType::kResolved;
-          size = GetPageSizeFromName(ident);
-      }
-    }
-  }
-  state.Style()->SetPageSizeType(page_size_type);
-  state.Style()->SetPageSize(size);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/speak_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/speak_custom.cc
deleted file mode 100644
index 46db889..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/speak_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/speak.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Speak::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Speak());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stop_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stop_color_custom.cc
deleted file mode 100644
index ff92bf9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stop_color_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stop_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StopColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color StopColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = style.StopColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* StopColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(style, style.StopColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stop_opacity_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stop_opacity_custom.cc
deleted file mode 100644
index 8c34280..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stop_opacity_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stop_opacity.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StopOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* StopOpacity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(svg_style.StopOpacity(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_custom.cc
deleted file mode 100644
index 2a48ffc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Stroke::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParsePaintStroke(range, context);
-}
-
-const CSSValue* Stroke::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::AdjustSVGPaintForCurrentColor(
-      svg_style.StrokePaint(), style.GetColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_dasharray_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_dasharray_custom.cc
deleted file mode 100644
index f55494a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_dasharray_custom.cc
+++ /dev/null
@@ -1,48 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_dasharray.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeDasharray::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValueList* dashes = CSSValueList::CreateCommaSeparated();
-  do {
-    CSSPrimitiveValue* dash =
-        css_property_parser_helpers::ConsumeLengthOrPercent(
-            range, kSVGAttributeMode, kValueRangeNonNegative);
-    if (!dash ||
-        (css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range) &&
-         range.AtEnd()))
-      return nullptr;
-    dashes->Append(*dash);
-  } while (!range.AtEnd());
-  return dashes;
-}
-
-const CSSValue* StrokeDasharray::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::StrokeDashArrayToCSSValueList(
-      *svg_style.StrokeDashArray(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_dashoffset_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_dashoffset_custom.cc
deleted file mode 100644
index c0e1406..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_dashoffset_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_dashoffset.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeDashoffset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* StrokeDashoffset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.StrokeDashOffset(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_linecap_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_linecap_custom.cc
deleted file mode 100644
index 97d000a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_linecap_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_linecap.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeLinecap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.CapStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_linejoin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_linejoin_custom.cc
deleted file mode 100644
index 74dc509c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_linejoin_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_linejoin.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeLinejoin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.JoinStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_miterlimit_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_miterlimit_custom.cc
deleted file mode 100644
index ba2f77b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_miterlimit_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_miterlimit.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeMiterlimit::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range,
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* StrokeMiterlimit::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(svg_style.StrokeMiterLimit(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_opacity_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_opacity_custom.cc
deleted file mode 100644
index 0f4f7ff..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_opacity_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_opacity.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* StrokeOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* StrokeOpacity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle&,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(svg_style.StrokeOpacity(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/stroke_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/stroke_width_custom.cc
deleted file mode 100644
index 7c90d53..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/stroke_width_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/stroke_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* StrokeWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeNonNegative,
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* StrokeWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const Length& length = svg_style.StrokeWidth().length();
-  if (length.IsFixed()) {
-    return CSSPrimitiveValue::Create(length.Value(),
-                                     CSSPrimitiveValue::UnitType::kPixels);
-  }
-  return CSSValue::Create(length, style.EffectiveZoom());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/tab_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/tab_size_custom.cc
deleted file mode 100644
index 6ff737c2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/tab_size_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/tab_size.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TabSize::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  CSSPrimitiveValue* parsed_value =
-      css_property_parser_helpers::ConsumeInteger(range, 0);
-  if (parsed_value)
-    return parsed_value;
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* TabSize::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.GetTabSize().GetPixelSize(1.0),
-                                   style.GetTabSize().IsSpaces()
-                                       ? CSSPrimitiveValue::UnitType::kNumber
-                                       : CSSPrimitiveValue::UnitType::kPixels);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/table_layout_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/table_layout_custom.cc
deleted file mode 100644
index 028428c4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/table_layout_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/table_layout.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TableLayout::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TableLayout());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_align_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_align_custom.cc
deleted file mode 100644
index 78168264..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_align_custom.cc
+++ /dev/null
@@ -1,47 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_align.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextAlign::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetTextAlign());
-}
-
-void TextAlign::ApplyValue(StyleResolverState& state,
-                           const CSSValue& value) const {
-  const auto* ident_value = DynamicTo<CSSIdentifierValue>(value);
-  if (ident_value &&
-      ident_value->GetValueID() != CSSValueID::kWebkitMatchParent) {
-    // Special case for th elements - UA stylesheet text-align does not apply if
-    // parent's computed value for text-align is not its initial value
-    // https://html.spec.whatwg.org/C/#tables-2
-    if (ident_value->GetValueID() == CSSValueID::kInternalCenter &&
-        state.ParentStyle()->GetTextAlign() !=
-            ComputedStyleInitialValues::InitialTextAlign())
-      state.Style()->SetTextAlign(state.ParentStyle()->GetTextAlign());
-    else
-      state.Style()->SetTextAlign(ident_value->ConvertTo<ETextAlign>());
-  } else if (state.ParentStyle()->GetTextAlign() == ETextAlign::kStart) {
-    state.Style()->SetTextAlign(state.ParentStyle()->IsLeftToRightDirection()
-                                    ? ETextAlign::kLeft
-                                    : ETextAlign::kRight);
-  } else if (state.ParentStyle()->GetTextAlign() == ETextAlign::kEnd) {
-    state.Style()->SetTextAlign(state.ParentStyle()->IsLeftToRightDirection()
-                                    ? ETextAlign::kRight
-                                    : ETextAlign::kLeft);
-  } else {
-    state.Style()->SetTextAlign(state.ParentStyle()->GetTextAlign());
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_align_last_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_align_last_custom.cc
deleted file mode 100644
index 37a2daf..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_align_last_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_align_last.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextAlignLast::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TextAlignLast());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_anchor_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_anchor_custom.cc
deleted file mode 100644
index b6fe998..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_anchor_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_anchor.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextAnchor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.TextAnchor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_combine_upright_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_combine_upright_custom.cc
deleted file mode 100644
index 36087bf3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_combine_upright_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_combine_upright.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextCombineUpright::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TextCombine());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_decoration_color_custom.cc
deleted file mode 100644
index e7d5215..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_color_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextDecorationColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color TextDecorationColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = style.DecorationColorIncludingFallback(visited_link);
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* TextDecorationColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(
-      style, style.TextDecorationColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_line_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_decoration_line_custom.cc
deleted file mode 100644
index c6b25d1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_line_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_line.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextDecorationLine::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeTextDecorationLine(range);
-}
-
-const CSSValue* TextDecorationLine::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::RenderTextDecorationFlagsToCSSValue(
-      style.GetTextDecoration());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_skip_ink_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_decoration_skip_ink_custom.cc
deleted file mode 100644
index b7786fcf..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_skip_ink_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_skip_ink.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextDecorationSkipInk::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForTextDecorationSkipInk(
-      style.TextDecorationSkipInk());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_decoration_style_custom.cc
deleted file mode 100644
index b5afc9a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_decoration_style_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_decoration_style.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextDecorationStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForTextDecorationStyle(
-      style.TextDecorationStyle());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_indent_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_indent_custom.cc
deleted file mode 100644
index f16041a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_indent_custom.cc
+++ /dev/null
@@ -1,126 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_indent.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextIndent::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // [ <length> | <percentage> ] && hanging? && each-line?
-  // Keywords only allowed when css3Text is enabled.
-  CSSValue* length_percentage = nullptr;
-  CSSValue* hanging = nullptr;
-  CSSValue* each_line = nullptr;
-  do {
-    if (!length_percentage) {
-      length_percentage = css_property_parser_helpers::ConsumeLengthOrPercent(
-          range, context.Mode(), kValueRangeAll,
-          css_property_parser_helpers::UnitlessQuirk::kAllow);
-      if (length_percentage) {
-        continue;
-      }
-    }
-
-    if (RuntimeEnabledFeatures::CSS3TextEnabled()) {
-      CSSValueID id = range.Peek().Id();
-      if (!hanging && id == CSSValueID::kHanging) {
-        hanging = css_property_parser_helpers::ConsumeIdent(range);
-        continue;
-      }
-      if (!each_line && id == CSSValueID::kEachLine) {
-        each_line = css_property_parser_helpers::ConsumeIdent(range);
-        continue;
-      }
-    }
-    return nullptr;
-  } while (!range.AtEnd());
-
-  if (!length_percentage)
-    return nullptr;
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*length_percentage);
-
-  if (hanging)
-    list->Append(*hanging);
-
-  if (each_line)
-    list->Append(*each_line);
-
-  return list;
-}
-
-const CSSValue* TextIndent::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.TextIndent(), style));
-  if (RuntimeEnabledFeatures::CSS3TextEnabled()) {
-    if (style.GetTextIndentType() == TextIndentType::kHanging)
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kHanging));
-    if (style.GetTextIndentLine() == TextIndentLine::kEachLine)
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kEachLine));
-  }
-  return list;
-}
-
-void TextIndent::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetTextIndent(ComputedStyleInitialValues::InitialTextIndent());
-  state.Style()->SetTextIndentLine(
-      ComputedStyleInitialValues::InitialTextIndentLine());
-  state.Style()->SetTextIndentType(
-      ComputedStyleInitialValues::InitialTextIndentType());
-}
-
-void TextIndent::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetTextIndent(state.ParentStyle()->TextIndent());
-  state.Style()->SetTextIndentLine(state.ParentStyle()->GetTextIndentLine());
-  state.Style()->SetTextIndentType(state.ParentStyle()->GetTextIndentType());
-}
-
-void TextIndent::ApplyValue(StyleResolverState& state,
-                            const CSSValue& value) const {
-  Length length_or_percentage_value;
-  TextIndentLine text_indent_line_value =
-      ComputedStyleInitialValues::InitialTextIndentLine();
-  TextIndentType text_indent_type_value =
-      ComputedStyleInitialValues::InitialTextIndentType();
-
-  for (auto& list_value : To<CSSValueList>(value)) {
-    if (auto* list_primitive_value =
-            DynamicTo<CSSPrimitiveValue>(*list_value)) {
-      length_or_percentage_value = list_primitive_value->ConvertToLength(
-          state.CssToLengthConversionData());
-    } else if (To<CSSIdentifierValue>(*list_value).GetValueID() ==
-               CSSValueID::kEachLine) {
-      text_indent_line_value = TextIndentLine::kEachLine;
-    } else if (To<CSSIdentifierValue>(*list_value).GetValueID() ==
-               CSSValueID::kHanging) {
-      text_indent_type_value = TextIndentType::kHanging;
-    } else {
-      NOTREACHED();
-    }
-  }
-
-  state.Style()->SetTextIndent(length_or_percentage_value);
-  state.Style()->SetTextIndentLine(text_indent_line_value);
-  state.Style()->SetTextIndentType(text_indent_type_value);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_justify_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_justify_custom.cc
deleted file mode 100644
index 14ea467..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_justify_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_justify.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextJustify::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetTextJustify());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_orientation_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_orientation_custom.cc
deleted file mode 100644
index 030d94c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_orientation_custom.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_orientation.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextOrientation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetTextOrientation());
-}
-
-void TextOrientation::ApplyValue(StyleResolverState& state,
-                                 const CSSValue& value) const {
-  state.SetTextOrientation(
-      To<CSSIdentifierValue>(value).ConvertTo<ETextOrientation>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_overflow_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_overflow_custom.cc
deleted file mode 100644
index 18b2fcb..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_overflow_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_overflow.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextOverflow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.TextOverflow() != ETextOverflow::kClip)
-    return CSSIdentifierValue::Create(CSSValueID::kEllipsis);
-  return CSSIdentifierValue::Create(CSSValueID::kClip);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_rendering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_rendering_custom.cc
deleted file mode 100644
index 7dba689..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_rendering_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_rendering.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextRendering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetFontDescription().TextRendering());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_shadow_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_shadow_custom.cc
deleted file mode 100644
index 2c4a857..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_shadow_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_shadow.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextShadow::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeShadow(
-      range, context.Mode(), css_parsing_utils::AllowInsetAndSpread::kForbid);
-}
-
-const CSSValue* TextShadow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForShadowList(style.TextShadow(), style,
-                                                false);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_size_adjust_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_size_adjust_custom.cc
deleted file mode 100644
index 97b0dc9e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_size_adjust_custom.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_size_adjust.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextSizeAdjust::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumePercent(range,
-                                                     kValueRangeNonNegative);
-}
-
-const CSSValue* TextSizeAdjust::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.GetTextSizeAdjust().IsAuto())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return CSSPrimitiveValue::Create(style.GetTextSizeAdjust().Multiplier() * 100,
-                                   CSSPrimitiveValue::UnitType::kPercentage);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_transform_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_transform_custom.cc
deleted file mode 100644
index 2a2a0f7d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_transform_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_transform.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TextTransform::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TextTransform());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/text_underline_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/text_underline_position_custom.cc
deleted file mode 100644
index 5bc6173..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/text_underline_position_custom.cc
+++ /dev/null
@@ -1,74 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/text_underline_position.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-// auto | [ under || [ left | right ] ]
-const CSSValue* TextUnderlinePosition::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSIdentifierValue* under_value =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
-  CSSIdentifierValue* left_or_right_value = nullptr;
-  if (RuntimeEnabledFeatures::TextUnderlinePositionLeftRightEnabled()) {
-    left_or_right_value =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kLeft,
-                                                  CSSValueID::kRight>(range);
-    if (left_or_right_value && !under_value) {
-      under_value =
-          css_property_parser_helpers::ConsumeIdent<CSSValueID::kUnder>(range);
-    }
-  }
-  if (!under_value && !left_or_right_value) {
-    return nullptr;
-  }
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (under_value)
-    list->Append(*under_value);
-  if (left_or_right_value)
-    list->Append(*left_or_right_value);
-  return list;
-}
-
-const CSSValue* TextUnderlinePosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  auto text_underline_position = style.TextUnderlinePosition();
-  if (text_underline_position == kTextUnderlinePositionAuto)
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  if (text_underline_position == kTextUnderlinePositionUnder)
-    return CSSIdentifierValue::Create(CSSValueID::kUnder);
-  if (text_underline_position == kTextUnderlinePositionLeft)
-    return CSSIdentifierValue::Create(CSSValueID::kLeft);
-  if (text_underline_position == kTextUnderlinePositionRight)
-    return CSSIdentifierValue::Create(CSSValueID::kRight);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  DCHECK(text_underline_position & kTextUnderlinePositionUnder);
-  list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
-  if (text_underline_position & kTextUnderlinePositionLeft)
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
-  if (text_underline_position & kTextUnderlinePositionRight)
-    list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
-  DCHECK_EQ(list->length(), 2U);
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/top_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/top_custom.cc
deleted file mode 100644
index 2d56fcc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/top_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* Top::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeMarginOrOffset(
-      range, context.Mode(),
-      css_parsing_utils::UnitlessUnlessShorthand(local_context));
-}
-
-bool Top::IsLayoutDependent(const ComputedStyle* style,
-                            LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* Top::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPositionOffset(style, *this,
-                                                    layout_object);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/touch_action_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/touch_action_custom.cc
deleted file mode 100644
index d3b38c2f..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/touch_action_custom.cc
+++ /dev/null
@@ -1,80 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/touch_action.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace {
-
-static bool ConsumePan(CSSParserTokenRange& range,
-                       CSSValue*& pan_x,
-                       CSSValue*& pan_y,
-                       CSSValue*& pinch_zoom) {
-  CSSValueID id = range.Peek().Id();
-  if ((id == CSSValueID::kPanX || id == CSSValueID::kPanRight ||
-       id == CSSValueID::kPanLeft) &&
-      !pan_x) {
-    pan_x = css_property_parser_helpers::ConsumeIdent(range);
-  } else if ((id == CSSValueID::kPanY || id == CSSValueID::kPanDown ||
-              id == CSSValueID::kPanUp) &&
-             !pan_y) {
-    pan_y = css_property_parser_helpers::ConsumeIdent(range);
-  } else if (id == CSSValueID::kPinchZoom && !pinch_zoom) {
-    pinch_zoom = css_property_parser_helpers::ConsumeIdent(range);
-  } else {
-    return false;
-  }
-  return true;
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* TouchAction::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kAuto || id == CSSValueID::kNone ||
-      id == CSSValueID::kManipulation) {
-    list->Append(*css_property_parser_helpers::ConsumeIdent(range));
-    return list;
-  }
-
-  CSSValue* pan_x = nullptr;
-  CSSValue* pan_y = nullptr;
-  CSSValue* pinch_zoom = nullptr;
-  if (!ConsumePan(range, pan_x, pan_y, pinch_zoom))
-    return nullptr;
-  if (!range.AtEnd() && !ConsumePan(range, pan_x, pan_y, pinch_zoom))
-    return nullptr;
-  if (!range.AtEnd() && !ConsumePan(range, pan_x, pan_y, pinch_zoom))
-    return nullptr;
-
-  if (pan_x)
-    list->Append(*pan_x);
-  if (pan_y)
-    list->Append(*pan_y);
-  if (pinch_zoom)
-    list->Append(*pinch_zoom);
-  return list;
-}
-
-const CSSValue* TouchAction::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::TouchActionFlagsToCSSValue(style.GetTouchAction());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transform_box_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transform_box_custom.cc
deleted file mode 100644
index 50dfff86..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transform_box_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transform_box.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransformBox::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TransformBox());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transform_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transform_custom.cc
deleted file mode 100644
index a84008a1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transform_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transform.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Transform::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ConsumeTransformList(range, context, local_context);
-}
-
-bool Transform::IsLayoutDependent(const ComputedStyle* style,
-                                  LayoutObject* layout_object) const {
-  return layout_object &&
-         (layout_object->IsBox() || layout_object->IsSVGChild());
-}
-
-const CSSValue* Transform::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ComputedTransform(layout_object, style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transform_origin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transform_origin_custom.cc
deleted file mode 100644
index 1cdce97..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transform_origin_custom.cc
+++ /dev/null
@@ -1,73 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transform_origin.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransformOrigin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValue* result_x = nullptr;
-  CSSValue* result_y = nullptr;
-  if (css_property_parser_helpers::ConsumeOneOrTwoValuedPosition(
-          range, context.Mode(),
-          css_property_parser_helpers::UnitlessQuirk::kForbid, result_x,
-          result_y)) {
-    CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-    list->Append(*result_x);
-    list->Append(*result_y);
-    CSSValue* result_z = css_property_parser_helpers::ConsumeLength(
-        range, context.Mode(), kValueRangeAll);
-    if (result_z)
-      list->Append(*result_z);
-    return list;
-  }
-  return nullptr;
-}
-
-bool TransformOrigin::IsLayoutDependent(const ComputedStyle* style,
-                                        LayoutObject* layout_object) const {
-  return layout_object &&
-         (layout_object->IsBox() || layout_object->IsSVGChild());
-}
-
-const CSSValue* TransformOrigin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  if (layout_object) {
-    FloatRect reference_box = ComputedStyleUtils::ReferenceBoxForTransform(
-        *layout_object, ComputedStyleUtils::kDontUsePixelSnappedBox);
-    FloatSize resolved_origin(
-        FloatValueForLength(style.TransformOriginX(), reference_box.Width()),
-        FloatValueForLength(style.TransformOriginY(), reference_box.Height()));
-    list->Append(*ZoomAdjustedPixelValue(resolved_origin.Width(), style));
-    list->Append(*ZoomAdjustedPixelValue(resolved_origin.Height(), style));
-  } else {
-    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-        style.TransformOriginX(), style));
-    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-        style.TransformOriginY(), style));
-  }
-  if (style.TransformOriginZ() != 0)
-    list->Append(*ZoomAdjustedPixelValue(style.TransformOriginZ(), style));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transform_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transform_style_custom.cc
deleted file mode 100644
index 6d7ab1b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transform_style_custom.cc
+++ /dev/null
@@ -1,23 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transform_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransformStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(
-      (style.TransformStyle3D() == ETransformStyle3D::kPreserve3d)
-          ? CSSValueID::kPreserve3d
-          : CSSValueID::kFlat);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transition_delay_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transition_delay_custom.cc
deleted file mode 100644
index 55a077e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transition_delay_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transition_delay.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransitionDelay::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeTime, range, kValueRangeAll);
-}
-
-const CSSValue* TransitionDelay::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationDelay(style.Transitions());
-}
-
-const CSSValue* TransitionDelay::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSValue>, value,
-      (CSSPrimitiveValue::Create(CSSTimingData::InitialDelay(),
-                                 CSSPrimitiveValue::UnitType::kSeconds)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transition_duration_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transition_duration_custom.cc
deleted file mode 100644
index dadf1e0..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transition_duration_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transition_duration.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/geometry/length.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransitionDuration::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeTime, range, kValueRangeNonNegative);
-}
-
-const CSSValue* TransitionDuration::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationDuration(style.Transitions());
-}
-
-const CSSValue* TransitionDuration::InitialValue() const {
-  DEFINE_STATIC_LOCAL(
-      Persistent<CSSValue>, value,
-      (CSSPrimitiveValue::Create(CSSTimingData::InitialDuration(),
-                                 CSSPrimitiveValue::UnitType::kSeconds)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transition_property_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transition_property_custom.cc
deleted file mode 100644
index ac8c834b1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transition_property_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transition_property.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransitionProperty::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueList* list = css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeTransitionProperty, range, context);
-  if (!list || !css_parsing_utils::IsValidPropertyList(*list))
-    return nullptr;
-  return list;
-}
-
-const CSSValue* TransitionProperty::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForTransitionProperty(style.Transitions());
-}
-
-const CSSValue* TransitionProperty::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kAll)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/transition_timing_function_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/transition_timing_function_custom.cc
deleted file mode 100644
index 51a1e6d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/transition_timing_function_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/transition_timing_function.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* TransitionTimingFunction::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeAnimationTimingFunction, range);
-}
-
-const CSSValue* TransitionTimingFunction::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForAnimationTimingFunction(
-      style.Transitions());
-}
-
-const CSSValue* TransitionTimingFunction::InitialValue() const {
-  DEFINE_STATIC_LOCAL(Persistent<CSSValue>, value,
-                      (CSSIdentifierValue::Create(CSSValueID::kEase)));
-  return value;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/translate_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/translate_custom.cc
deleted file mode 100644
index 41e66f7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/translate_custom.cc
+++ /dev/null
@@ -1,82 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/translate.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_box.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Translate::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  DCHECK(RuntimeEnabledFeatures::CSSIndependentTransformPropertiesEnabled());
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValue* translate_x = css_property_parser_helpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeAll);
-  if (!translate_x)
-    return nullptr;
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*translate_x);
-  CSSPrimitiveValue* translate_y =
-      css_property_parser_helpers::ConsumeLengthOrPercent(range, context.Mode(),
-                                                          kValueRangeAll);
-  if (translate_y) {
-    CSSValue* translate_z = css_property_parser_helpers::ConsumeLength(
-        range, context.Mode(), kValueRangeAll);
-    if (translate_y->GetIntValue() == 0 && !translate_z)
-      return list;
-
-    list->Append(*translate_y);
-    if (translate_z) {
-      list->Append(*translate_z);
-    }
-  }
-
-  return list;
-}
-
-bool Translate::IsLayoutDependent(const ComputedStyle* style,
-                                  LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-const CSSValue* Translate::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.Translate())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-      style.Translate()->X(), style));
-
-  if (!style.Translate()->Y().IsZero() || style.Translate()->Z() != 0) {
-    list->Append(*ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-        style.Translate()->Y(), style));
-  }
-
-  if (style.Translate()->Z() != 0)
-    list->Append(*ZoomAdjustedPixelValue(style.Translate()->Z(), style));
-
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/unicode_bidi_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/unicode_bidi_custom.cc
deleted file mode 100644
index 8680d3e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/unicode_bidi_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/unicode_bidi.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* UnicodeBidi::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetUnicodeBidi());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/user_select_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/user_select_custom.cc
deleted file mode 100644
index 5fca6fe..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/user_select_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/user_select.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* UserSelect::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.UserSelect());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/vector_effect_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/vector_effect_custom.cc
deleted file mode 100644
index 2c65fd5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/vector_effect_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/vector_effect.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* VectorEffect::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(svg_style.VectorEffect());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/vertical_align_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/vertical_align_custom.cc
deleted file mode 100644
index 3d1671c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/vertical_align_custom.cc
+++ /dev/null
@@ -1,84 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/vertical_align.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* VerticalAlign::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValue* parsed_value = css_property_parser_helpers::ConsumeIdentRange(
-      range, CSSValueID::kBaseline, CSSValueID::kWebkitBaselineMiddle);
-  if (!parsed_value) {
-    parsed_value = css_property_parser_helpers::ConsumeLengthOrPercent(
-        range, context.Mode(), kValueRangeAll,
-        css_property_parser_helpers::UnitlessQuirk::kAllow);
-  }
-  return parsed_value;
-}
-
-const CSSValue* VerticalAlign::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  switch (style.VerticalAlign()) {
-    case EVerticalAlign::kBaseline:
-      return CSSIdentifierValue::Create(CSSValueID::kBaseline);
-    case EVerticalAlign::kMiddle:
-      return CSSIdentifierValue::Create(CSSValueID::kMiddle);
-    case EVerticalAlign::kSub:
-      return CSSIdentifierValue::Create(CSSValueID::kSub);
-    case EVerticalAlign::kSuper:
-      return CSSIdentifierValue::Create(CSSValueID::kSuper);
-    case EVerticalAlign::kTextTop:
-      return CSSIdentifierValue::Create(CSSValueID::kTextTop);
-    case EVerticalAlign::kTextBottom:
-      return CSSIdentifierValue::Create(CSSValueID::kTextBottom);
-    case EVerticalAlign::kTop:
-      return CSSIdentifierValue::Create(CSSValueID::kTop);
-    case EVerticalAlign::kBottom:
-      return CSSIdentifierValue::Create(CSSValueID::kBottom);
-    case EVerticalAlign::kBaselineMiddle:
-      return CSSIdentifierValue::Create(CSSValueID::kWebkitBaselineMiddle);
-    case EVerticalAlign::kLength:
-      return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(
-          style.GetVerticalAlignLength(), style);
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
-void VerticalAlign::ApplyInherit(StyleResolverState& state) const {
-  EVerticalAlign vertical_align = state.ParentStyle()->VerticalAlign();
-  state.Style()->SetVerticalAlign(vertical_align);
-  if (vertical_align == EVerticalAlign::kLength) {
-    state.Style()->SetVerticalAlignLength(
-        state.ParentStyle()->GetVerticalAlignLength());
-  }
-}
-
-void VerticalAlign::ApplyValue(StyleResolverState& state,
-                               const CSSValue& value) const {
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    state.Style()->SetVerticalAlign(
-        identifier_value->ConvertTo<EVerticalAlign>());
-  } else {
-    state.Style()->SetVerticalAlignLength(
-        To<CSSPrimitiveValue>(value).ConvertToLength(
-            state.CssToLengthConversionData()));
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/visibility_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/visibility_custom.cc
deleted file mode 100644
index bf661350..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/visibility_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/visibility.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Visibility::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Visibility());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_app_region_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_app_region_custom.cc
deleted file mode 100644
index bbcd222..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_app_region_custom.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_app_region.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitAppRegion::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  if (style.DraggableRegionMode() == EDraggableRegionMode::kNone)
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return CSSIdentifierValue::Create(style.DraggableRegionMode() ==
-                                            EDraggableRegionMode::kDrag
-                                        ? CSSValueID::kDrag
-                                        : CSSValueID::kNoDrag);
-}
-
-void WebkitAppRegion::ApplyInitial(StyleResolverState& state) const {}
-
-void WebkitAppRegion::ApplyInherit(StyleResolverState& state) const {}
-
-void WebkitAppRegion::ApplyValue(StyleResolverState& state,
-                                 const CSSValue& value) const {
-  const auto& identifier_value = To<CSSIdentifierValue>(value);
-  state.Style()->SetDraggableRegionMode(identifier_value.GetValueID() ==
-                                                CSSValueID::kDrag
-                                            ? EDraggableRegionMode::kDrag
-                                            : EDraggableRegionMode::kNoDrag);
-  state.GetDocument().SetHasAnnotatedRegions(true);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_appearance_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_appearance_custom.cc
deleted file mode 100644
index e548064b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_appearance_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_appearance.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitAppearance::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.Appearance());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_horizontal_spacing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_border_horizontal_spacing_custom.cc
deleted file mode 100644
index 965ce1c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_horizontal_spacing_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_horizontal_spacing.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBorderHorizontalSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue*
-WebkitBorderHorizontalSpacing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.HorizontalBorderSpacing(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_image_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_border_image_custom.cc
deleted file mode 100644
index 0ff4bd4e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_image_custom.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_image.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBorderImage::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWebkitBorderImage(range, context);
-}
-
-const CSSValue* WebkitBorderImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImage(style.BorderImage(), style);
-}
-
-void WebkitBorderImage::ApplyValue(StyleResolverState& state,
-                                   const CSSValue& value) const {
-  NinePieceImage image;
-  CSSToStyleMap::MapNinePieceImage(state, CSSPropertyID::kWebkitBorderImage,
-                                   value, image);
-  state.Style()->SetBorderImage(image);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_vertical_spacing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_border_vertical_spacing_custom.cc
deleted file mode 100644
index b0fd820..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_border_vertical_spacing_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_border_vertical_spacing.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBorderVerticalSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeNonNegative);
-}
-
-const CSSValue* WebkitBorderVerticalSpacing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.VerticalBorderSpacing(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_align_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_align_custom.cc
deleted file mode 100644
index 5541d46..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_align_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_align.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxAlign::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BoxAlign());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_decoration_break_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_decoration_break_custom.cc
deleted file mode 100644
index 3644c3e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_decoration_break_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_decoration_break.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxDecorationBreak::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.BoxDecorationBreak() == EBoxDecorationBreak::kSlice)
-    return CSSIdentifierValue::Create(CSSValueID::kSlice);
-  return CSSIdentifierValue::Create(CSSValueID::kClone);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_direction_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_direction_custom.cc
deleted file mode 100644
index 9c27821..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_direction_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_direction.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxDirection::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BoxDirection());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_flex_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_flex_custom.cc
deleted file mode 100644
index 5504909e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_flex_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_flex.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxFlex::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-const CSSValue* WebkitBoxFlex::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.BoxFlex(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_ordinal_group_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_ordinal_group_custom.cc
deleted file mode 100644
index 502aaef..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_ordinal_group_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_ordinal_group.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxOrdinalGroup::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumePositiveInteger(range);
-}
-
-const CSSValue* WebkitBoxOrdinalGroup::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.BoxOrdinalGroup(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_orient_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_orient_custom.cc
deleted file mode 100644
index ec1ace9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_orient_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_orient.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxOrient::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BoxOrient());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_pack_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_pack_custom.cc
deleted file mode 100644
index 834b6e3..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_pack_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_pack.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitBoxPack::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.BoxPack());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_reflect_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_box_reflect_custom.cc
deleted file mode 100644
index 6325873..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_box_reflect_custom.cc
+++ /dev/null
@@ -1,67 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_box_reflect.h"
-
-#include "third_party/blink/renderer/core/css/css_primitive_value.h"
-#include "third_party/blink/renderer/core/css/css_reflect_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace {
-
-CSSValue* ConsumeReflect(CSSParserTokenRange& range,
-                         const CSSParserContext& context) {
-  CSSIdentifierValue* direction = css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kAbove, CSSValueID::kBelow, CSSValueID::kLeft,
-      CSSValueID::kRight>(range);
-  if (!direction)
-    return nullptr;
-
-  CSSPrimitiveValue* offset = nullptr;
-  if (range.AtEnd()) {
-    offset = CSSPrimitiveValue::Create(0, CSSPrimitiveValue::UnitType::kPixels);
-  } else {
-    offset = ConsumeLengthOrPercent(
-        range, context.Mode(), kValueRangeAll,
-        css_property_parser_helpers::UnitlessQuirk::kForbid);
-    if (!offset)
-      return nullptr;
-  }
-
-  CSSValue* mask = nullptr;
-  if (!range.AtEnd()) {
-    mask = css_parsing_utils::ConsumeWebkitBorderImage(range, context);
-    if (!mask)
-      return nullptr;
-  }
-  return MakeGarbageCollected<cssvalue::CSSReflectValue>(direction, offset,
-                                                         mask);
-}
-
-}  // namespace
-namespace css_longhand {
-
-const CSSValue* WebkitBoxReflect::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeReflect(range, context);
-}
-
-const CSSValue* WebkitBoxReflect::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForReflection(style.BoxReflect(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_font_size_delta_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_font_size_delta_custom.cc
deleted file mode 100644
index ed33b92..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_font_size_delta_custom.cc
+++ /dev/null
@@ -1,23 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_font_size_delta.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitFontSizeDelta::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(
-      range, context.Mode(), kValueRangeAll,
-      css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_font_smoothing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_font_smoothing_custom.cc
deleted file mode 100644
index 7efe52b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_font_smoothing_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_font_smoothing.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitFontSmoothing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetFontDescription().FontSmoothing());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_highlight_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_highlight_custom.cc
deleted file mode 100644
index f4eeaae..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_highlight_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_highlight.h"
-
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitHighlight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeString(range);
-}
-
-const CSSValue* WebkitHighlight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.Highlight() == g_null_atom)
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return MakeGarbageCollected<CSSStringValue>(style.Highlight());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_hyphenate_character_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_hyphenate_character_custom.cc
deleted file mode 100644
index 62c70260..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_hyphenate_character_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_hyphenate_character.h"
-
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitHyphenateCharacter::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeString(range);
-}
-
-const CSSValue* WebkitHyphenateCharacter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HyphenationString().IsNull())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return MakeGarbageCollected<CSSStringValue>(style.HyphenationString());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_line_break_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_line_break_custom.cc
deleted file mode 100644
index 3e56971..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_line_break_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_line_break.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitLineBreak::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetLineBreak());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_line_clamp_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_line_clamp_custom.cc
deleted file mode 100644
index d01769a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_line_clamp_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_line_clamp.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitLineClamp::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  // When specifying number of lines, don't allow 0 as a valid value.
-  return css_property_parser_helpers::ConsumePositiveInteger(range);
-}
-
-const CSSValue* WebkitLineClamp::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (!style.HasLineClamp())
-    return CSSIdentifierValue::Create(CSSValueID::kNone);
-  return CSSPrimitiveValue::Create(style.LineClamp(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_locale_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_locale_custom.cc
deleted file mode 100644
index f66dc868..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_locale_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_locale.h"
-
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitLocale::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeString(range);
-}
-
-const CSSValue* WebkitLocale::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.Locale().IsNull())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return MakeGarbageCollected<CSSStringValue>(style.Locale());
-}
-
-void WebkitLocale::ApplyValue(StyleResolverState& state,
-                              const CSSValue& value) const {
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kAuto);
-    state.GetFontBuilder().SetLocale(nullptr);
-  } else {
-    state.GetFontBuilder().SetLocale(
-        LayoutLocale::Get(AtomicString(To<CSSStringValue>(value).Value())));
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_after_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_after_collapse_custom.cc
deleted file mode 100644
index cc9a583..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_after_collapse_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_after_collapse.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMarginAfterCollapse::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.MarginAfterCollapse());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_before_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_before_collapse_custom.cc
deleted file mode 100644
index d5aed0b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_before_collapse_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_before_collapse.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMarginBeforeCollapse::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.MarginBeforeCollapse());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_bottom_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_bottom_collapse_custom.cc
deleted file mode 100644
index 096a6a5..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_bottom_collapse_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_bottom_collapse.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMarginBottomCollapse::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.MarginAfterCollapse());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_top_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_top_collapse_custom.cc
deleted file mode 100644
index b249f9a..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_margin_top_collapse_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_margin_top_collapse.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMarginTopCollapse::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.MarginBeforeCollapse());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_outset_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_outset_custom.cc
deleted file mode 100644
index f06733d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_outset_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_outset.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskBoxImageOutset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageOutset(range);
-}
-
-const CSSValue* WebkitMaskBoxImageOutset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageQuad(
-      style.MaskBoxImage().Outset(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_repeat_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_repeat_custom.cc
deleted file mode 100644
index 814a43b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_repeat_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_repeat.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskBoxImageRepeat::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageRepeat(range);
-}
-
-const CSSValue* WebkitMaskBoxImageRepeat::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageRepeat(style.MaskBoxImage());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_slice_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_slice_custom.cc
deleted file mode 100644
index 93383d2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_slice_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_slice.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskBoxImageSlice::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageSlice(
-      range, css_parsing_utils::DefaultFill::kNoFill);
-}
-
-const CSSValue* WebkitMaskBoxImageSlice::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageSlice(style.MaskBoxImage());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_source_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_source_custom.cc
deleted file mode 100644
index 25a8d40e..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_source_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_source.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* WebkitMaskBoxImageSource::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeImageOrNone(range, &context);
-}
-
-const CSSValue* WebkitMaskBoxImageSource::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  if (style.MaskBoxImageSource())
-    return style.MaskBoxImageSource()->ComputedCSSValue();
-  return CSSIdentifierValue::Create(CSSValueID::kNone);
-}
-
-void WebkitMaskBoxImageSource::ApplyValue(StyleResolverState& state,
-                                          const CSSValue& value) const {
-  state.Style()->SetMaskBoxImageSource(
-      state.GetStyleImage(CSSPropertyID::kWebkitMaskBoxImageSource, value));
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_width_custom.cc
deleted file mode 100644
index 5480dac2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_width_custom.cc
+++ /dev/null
@@ -1,32 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_box_image_width.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskBoxImageWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeBorderImageWidth(range);
-}
-
-const CSSValue* WebkitMaskBoxImageWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImageQuad(
-      style.MaskBoxImage().BorderSlices(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_clip_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_clip_custom.cc
deleted file mode 100644
index 6b4721c4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_clip_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_clip.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskClip::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePrefixedBackgroundBox, range,
-      css_parsing_utils::AllowTextValue::kAllow);
-}
-
-const CSSValue* WebkitMaskClip::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const FillLayer* curr_layer = &style.MaskLayers();
-  for (; curr_layer; curr_layer = curr_layer->Next()) {
-    EFillBox box = curr_layer->Clip();
-    list->Append(*CSSIdentifierValue::Create(box));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_composite_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_composite_custom.cc
deleted file mode 100644
index 65aa267..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_composite_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_composite.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskComposite::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumeBackgroundComposite, range);
-}
-
-const CSSValue* WebkitMaskComposite::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const FillLayer* curr_layer = &style.MaskLayers();
-  for (; curr_layer; curr_layer = curr_layer->Next())
-    list->Append(*CSSIdentifierValue::Create(curr_layer->Composite()));
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_image_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_image_custom.cc
deleted file mode 100644
index 07f34cb..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_image_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_image.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskImage::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_property_parser_helpers::ConsumeImageOrNone, range, &context);
-}
-
-const CSSValue* WebkitMaskImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer& fill_layer = style.MaskLayers();
-  return ComputedStyleUtils::BackgroundImageOrWebkitMaskImage(fill_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_origin_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_origin_custom.cc
deleted file mode 100644
index 1ef8a4b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_origin_custom.cc
+++ /dev/null
@@ -1,40 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_origin.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskOrigin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePrefixedBackgroundBox, range,
-      css_parsing_utils::AllowTextValue::kForbid);
-}
-
-const CSSValue* WebkitMaskOrigin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateCommaSeparated();
-  const FillLayer* curr_layer = &style.MaskLayers();
-  for (; curr_layer; curr_layer = curr_layer->Next()) {
-    EFillBox box = curr_layer->Origin();
-    list->Append(*CSSIdentifierValue::Create(box));
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_x_custom.cc
deleted file mode 100644
index 29ae3a8..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_x_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_x.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskPositionX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
-                                                 CSSValueID::kRight>,
-      range, context.Mode());
-}
-
-const CSSValue* WebkitMaskPositionX::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer* curr_layer = &style.MaskLayers();
-  return ComputedStyleUtils::BackgroundPositionXOrWebkitMaskPositionX(
-      style, curr_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_y_custom.cc
deleted file mode 100644
index 163b673..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_y_custom.cc
+++ /dev/null
@@ -1,38 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_position_y.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskPositionY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeCommaSeparatedList(
-      css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
-                                                 CSSValueID::kBottom>,
-      range, context.Mode());
-}
-
-const CSSValue* WebkitMaskPositionY::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer* curr_layer = &style.MaskLayers();
-  return ComputedStyleUtils::BackgroundPositionYOrWebkitMaskPositionY(
-      style, curr_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_size_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_size_custom.cc
deleted file mode 100644
index 2f6565b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_mask_size_custom.cc
+++ /dev/null
@@ -1,34 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_mask_size.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/frame/web_feature.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitMaskSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return css_parsing_utils::ParseBackgroundOrMaskSize(
-      range, context, local_context, WebFeature::kNegativeMaskSize);
-}
-
-const CSSValue* WebkitMaskSize::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  const FillLayer& fill_layer = style.MaskLayers();
-  return ComputedStyleUtils::BackgroundImageOrWebkitMaskSize(style, fill_layer);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_x_custom.cc
deleted file mode 100644
index 6cf7cd71..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_x_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_x.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitPerspectiveOriginX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
-                                                    CSSValueID::kRight>(
-      range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_y_custom.cc
deleted file mode 100644
index 14bd3d7..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_y_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_perspective_origin_y.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitPerspectiveOriginY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
-                                                    CSSValueID::kBottom>(
-      range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_print_color_adjust_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_print_color_adjust_custom.cc
deleted file mode 100644
index 6f2f4de..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_print_color_adjust_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_print_color_adjust.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitPrintColorAdjust::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.PrintColorAdjust());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_rtl_ordering_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_rtl_ordering_custom.cc
deleted file mode 100644
index 80bf611..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_rtl_ordering_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_rtl_ordering.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitRtlOrdering::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.RtlOrdering() == EOrder::kVisual
-                                        ? CSSValueID::kVisual
-                                        : CSSValueID::kLogical);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_ruby_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_ruby_position_custom.cc
deleted file mode 100644
index 27992bae..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_ruby_position_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_ruby_position.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitRubyPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetRubyPosition());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_tap_highlight_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_tap_highlight_color_custom.cc
deleted file mode 100644
index f438a4bc..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_tap_highlight_color_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_tap_highlight_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTapHighlightColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color WebkitTapHighlightColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = style.TapHighlightColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* WebkitTapHighlightColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(
-      style, style.TapHighlightColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_combine_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_combine_custom.cc
deleted file mode 100644
index f4d31df..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_combine_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_combine.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextCombine::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.TextCombine() == ETextCombine::kAll)
-    return CSSIdentifierValue::Create(CSSValueID::kHorizontal);
-  return CSSIdentifierValue::Create(style.TextCombine());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_decorations_in_effect_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_decorations_in_effect_custom.cc
deleted file mode 100644
index af03a24..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_decorations_in_effect_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_decorations_in_effect.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextDecorationsInEffect::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeTextDecorationLine(range);
-}
-
-const CSSValue*
-WebkitTextDecorationsInEffect::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::RenderTextDecorationFlagsToCSSValue(
-      style.TextDecorationsInEffect());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_color_custom.cc
deleted file mode 100644
index fa835640..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_color_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextEmphasisColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color WebkitTextEmphasisColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkTextEmphasisColor()
-                                   : style.TextEmphasisColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* WebkitTextEmphasisColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(
-      style, style.TextEmphasisColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_position_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_position_custom.cc
deleted file mode 100644
index be00b7d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_position_custom.cc
+++ /dev/null
@@ -1,97 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_position.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-// [ over | under ] && [ right | left ]?
-// If [ right | left ] is omitted, it defaults to right.
-const CSSValue* WebkitTextEmphasisPosition::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSIdentifierValue* values[2] = {
-      css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kOver, CSSValueID::kUnder, CSSValueID::kRight,
-          CSSValueID::kLeft>(range),
-      nullptr};
-  if (!values[0])
-    return nullptr;
-  values[1] = css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kOver, CSSValueID::kUnder, CSSValueID::kRight,
-      CSSValueID::kLeft>(range);
-  CSSIdentifierValue* over_under = nullptr;
-  CSSIdentifierValue* left_right = nullptr;
-
-  for (auto* value : values) {
-    if (!value)
-      break;
-    switch (value->GetValueID()) {
-      case CSSValueID::kOver:
-      case CSSValueID::kUnder:
-        if (over_under)
-          return nullptr;
-        over_under = value;
-        break;
-      case CSSValueID::kLeft:
-      case CSSValueID::kRight:
-        if (left_right)
-          return nullptr;
-        left_right = value;
-        break;
-      default:
-        NOTREACHED();
-        break;
-    }
-  }
-  if (!over_under)
-    return nullptr;
-  if (!left_right)
-    left_right = CSSIdentifierValue::Create(CSSValueID::kRight);
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*over_under);
-  list->Append(*left_right);
-  return list;
-}
-
-const CSSValue* WebkitTextEmphasisPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  switch (style.GetTextEmphasisPosition()) {
-    case TextEmphasisPosition::kOverRight:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kOver));
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
-      break;
-    case TextEmphasisPosition::kOverLeft:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kOver));
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
-      break;
-    case TextEmphasisPosition::kUnderRight:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kRight));
-      break;
-    case TextEmphasisPosition::kUnderLeft:
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kUnder));
-      list->Append(*CSSIdentifierValue::Create(CSSValueID::kLeft));
-      break;
-  }
-  return list;
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_style_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_style_custom.cc
deleted file mode 100644
index 3befa47..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_style_custom.cc
+++ /dev/null
@@ -1,143 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_emphasis_style.h"
-
-#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
-#include "third_party/blink/renderer/core/css/css_string_value.h"
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextEmphasisStyle::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  CSSValueID id = range.Peek().Id();
-  if (id == CSSValueID::kNone)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  if (CSSValue* text_emphasis_style =
-          css_property_parser_helpers::ConsumeString(range))
-    return text_emphasis_style;
-
-  CSSIdentifierValue* fill =
-      css_property_parser_helpers::ConsumeIdent<CSSValueID::kFilled,
-                                                CSSValueID::kOpen>(range);
-  CSSIdentifierValue* shape = css_property_parser_helpers::ConsumeIdent<
-      CSSValueID::kDot, CSSValueID::kCircle, CSSValueID::kDoubleCircle,
-      CSSValueID::kTriangle, CSSValueID::kSesame>(range);
-  if (!fill) {
-    fill = css_property_parser_helpers::ConsumeIdent<CSSValueID::kFilled,
-                                                     CSSValueID::kOpen>(range);
-  }
-  if (fill && shape) {
-    CSSValueList* parsed_values = CSSValueList::CreateSpaceSeparated();
-    parsed_values->Append(*fill);
-    parsed_values->Append(*shape);
-    return parsed_values;
-  }
-  if (fill)
-    return fill;
-  if (shape)
-    return shape;
-  return nullptr;
-}
-
-const CSSValue* WebkitTextEmphasisStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  switch (style.GetTextEmphasisMark()) {
-    case TextEmphasisMark::kNone:
-      return CSSIdentifierValue::Create(CSSValueID::kNone);
-    case TextEmphasisMark::kCustom:
-      return MakeGarbageCollected<CSSStringValue>(
-          style.TextEmphasisCustomMark());
-    case TextEmphasisMark::kAuto:
-      NOTREACHED();
-      FALLTHROUGH;
-    case TextEmphasisMark::kDot:
-    case TextEmphasisMark::kCircle:
-    case TextEmphasisMark::kDoubleCircle:
-    case TextEmphasisMark::kTriangle:
-    case TextEmphasisMark::kSesame: {
-      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-      list->Append(*CSSIdentifierValue::Create(style.GetTextEmphasisFill()));
-      list->Append(*CSSIdentifierValue::Create(style.GetTextEmphasisMark()));
-      return list;
-    }
-  }
-  NOTREACHED();
-  return nullptr;
-}
-
-void WebkitTextEmphasisStyle::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetTextEmphasisFill(
-      ComputedStyleInitialValues::InitialTextEmphasisFill());
-  state.Style()->SetTextEmphasisMark(
-      ComputedStyleInitialValues::InitialTextEmphasisMark());
-  state.Style()->SetTextEmphasisCustomMark(
-      ComputedStyleInitialValues::InitialTextEmphasisCustomMark());
-}
-
-void WebkitTextEmphasisStyle::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetTextEmphasisFill(
-      state.ParentStyle()->GetTextEmphasisFill());
-  state.Style()->SetTextEmphasisMark(
-      state.ParentStyle()->GetTextEmphasisMark());
-  state.Style()->SetTextEmphasisCustomMark(
-      state.ParentStyle()->TextEmphasisCustomMark());
-}
-
-void WebkitTextEmphasisStyle::ApplyValue(StyleResolverState& state,
-                                         const CSSValue& value) const {
-  if (const auto* list = DynamicTo<CSSValueList>(value)) {
-    DCHECK_EQ(list->length(), 2U);
-    for (unsigned i = 0; i < 2; ++i) {
-      const auto& ident_value = To<CSSIdentifierValue>(list->Item(i));
-      if (ident_value.GetValueID() == CSSValueID::kFilled ||
-          ident_value.GetValueID() == CSSValueID::kOpen) {
-        state.Style()->SetTextEmphasisFill(
-            ident_value.ConvertTo<TextEmphasisFill>());
-      } else {
-        state.Style()->SetTextEmphasisMark(
-            ident_value.ConvertTo<TextEmphasisMark>());
-      }
-    }
-    state.Style()->SetTextEmphasisCustomMark(g_null_atom);
-    return;
-  }
-
-  if (auto* string_value = DynamicTo<CSSStringValue>(value)) {
-    state.Style()->SetTextEmphasisFill(TextEmphasisFill::kFilled);
-    state.Style()->SetTextEmphasisMark(TextEmphasisMark::kCustom);
-    state.Style()->SetTextEmphasisCustomMark(
-        AtomicString(string_value->Value()));
-    return;
-  }
-
-  const auto& identifier_value = To<CSSIdentifierValue>(value);
-
-  state.Style()->SetTextEmphasisCustomMark(g_null_atom);
-
-  if (identifier_value.GetValueID() == CSSValueID::kFilled ||
-      identifier_value.GetValueID() == CSSValueID::kOpen) {
-    state.Style()->SetTextEmphasisFill(
-        identifier_value.ConvertTo<TextEmphasisFill>());
-    state.Style()->SetTextEmphasisMark(TextEmphasisMark::kAuto);
-  } else {
-    state.Style()->SetTextEmphasisFill(TextEmphasisFill::kFilled);
-    state.Style()->SetTextEmphasisMark(
-        identifier_value.ConvertTo<TextEmphasisMark>());
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_fill_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_fill_color_custom.cc
deleted file mode 100644
index bb214a6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_fill_color_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_fill_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextFillColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color WebkitTextFillColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result =
-      visited_link ? style.VisitedLinkTextFillColor() : style.TextFillColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* WebkitTextFillColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(style,
-                                                      style.TextFillColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_orientation_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_orientation_custom.cc
deleted file mode 100644
index 29b4c26..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_orientation_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_orientation.h"
-
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextOrientation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.GetTextOrientation() == ETextOrientation::kMixed)
-    return CSSIdentifierValue::Create(CSSValueID::kVerticalRight);
-  return CSSIdentifierValue::Create(style.GetTextOrientation());
-}
-
-void WebkitTextOrientation::ApplyValue(StyleResolverState& state,
-                                       const CSSValue& value) const {
-  state.SetTextOrientation(
-      To<CSSIdentifierValue>(value).ConvertTo<ETextOrientation>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_security_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_security_custom.cc
deleted file mode 100644
index 4fc247e1..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_security_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_security.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextSecurity::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.TextSecurity());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_color_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_color_custom.cc
deleted file mode 100644
index 1da797d6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_color_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace css_longhand {
-
-const CSSValue* WebkitTextStrokeColor::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeColor(range, context.Mode());
-}
-
-const blink::Color WebkitTextStrokeColor::ColorIncludingFallback(
-    bool visited_link,
-    const ComputedStyle& style) const {
-  StyleColor result = visited_link ? style.VisitedLinkTextStrokeColor()
-                                   : style.TextStrokeColor();
-  if (!result.IsCurrentColor())
-    return result.GetColor();
-  return visited_link ? style.VisitedLinkColor() : style.GetColor();
-}
-
-const CSSValue* WebkitTextStrokeColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::CurrentColorOrValidColor(style,
-                                                      style.TextStrokeColor());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_width_custom.cc
deleted file mode 100644
index 5623d1b..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_width_custom.cc
+++ /dev/null
@@ -1,33 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_text_stroke_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTextStrokeWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLineWidth(
-      range, context.Mode(),
-      css_property_parser_helpers::UnitlessQuirk::kForbid);
-}
-
-const CSSValue* WebkitTextStrokeWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.TextStrokeWidth(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_x_custom.cc
deleted file mode 100644
index 7e5ccd2..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_x_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_x.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTransformOriginX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kLeft,
-                                                    CSSValueID::kRight>(
-      range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_y_custom.cc
deleted file mode 100644
index e0101ef..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_y_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_y.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css_value_keywords.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTransformOriginY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumePositionLonghand<CSSValueID::kTop,
-                                                    CSSValueID::kBottom>(
-      range, context.Mode());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_z_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_z_custom.cc
deleted file mode 100644
index d417dd4..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_z_custom.cc
+++ /dev/null
@@ -1,22 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_transform_origin_z.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitTransformOriginZ::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeLength(range, context.Mode(),
-                                                    kValueRangeAll);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_user_drag_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_user_drag_custom.cc
deleted file mode 100644
index 284a76c6..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_user_drag_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_user_drag.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitUserDrag::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.UserDrag());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_user_modify_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_user_modify_custom.cc
deleted file mode 100644
index f0ee863..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_user_modify_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_user_modify.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitUserModify::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.UserModify());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/webkit_writing_mode_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/webkit_writing_mode_custom.cc
deleted file mode 100644
index 8a68e0d..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/webkit_writing_mode_custom.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/webkit_writing_mode.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WebkitWritingMode::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetWritingMode());
-}
-
-void WebkitWritingMode::ApplyValue(StyleResolverState& state,
-                                   const CSSValue& value) const {
-  state.SetWritingMode(
-      To<CSSIdentifierValue>(value).ConvertTo<blink::WritingMode>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/white_space_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/white_space_custom.cc
deleted file mode 100644
index d3536122..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/white_space_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/white_space.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WhiteSpace::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.WhiteSpace());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/widows_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/widows_custom.cc
deleted file mode 100644
index cded023..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/widows_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/widows.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Widows::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumePositiveInteger(range);
-}
-
-const CSSValue* Widows::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.Widows(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/width_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/width_custom.cc
deleted file mode 100644
index 8414fa9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/width_custom.cc
+++ /dev/null
@@ -1,43 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Width::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  return css_parsing_utils::ConsumeWidthOrHeight(
-      range, context, css_property_parser_helpers::UnitlessQuirk::kAllow);
-}
-
-bool Width::IsLayoutDependent(const ComputedStyle* style,
-                              LayoutObject* layout_object) const {
-  return layout_object && (layout_object->IsBox() || layout_object->IsSVG());
-}
-
-const CSSValue* Width::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (ComputedStyleUtils::WidthOrHeightShouldReturnUsedValue(layout_object)) {
-    return ZoomAdjustedPixelValue(
-        ComputedStyleUtils::UsedBoxSize(*layout_object).Width(), style);
-  }
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(style.Width(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/will_change_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/will_change_custom.cc
deleted file mode 100644
index 809d5ff..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/will_change_custom.cc
+++ /dev/null
@@ -1,136 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/will_change.h"
-
-#include "third_party/blink/renderer/core/css/css_value_list.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_token_range.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WillChange::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-
-  CSSValueList* values = CSSValueList::CreateCommaSeparated();
-  // Every comma-separated list of identifiers is a valid will-change value,
-  // unless the list includes an explicitly disallowed identifier.
-  while (true) {
-    if (range.Peek().GetType() != kIdentToken)
-      return nullptr;
-    CSSPropertyID unresolved_property =
-        UnresolvedCSSPropertyID(range.Peek().Value());
-    if (unresolved_property != CSSPropertyID::kInvalid &&
-        unresolved_property != CSSPropertyID::kVariable) {
-#if DCHECK_IS_ON()
-      DCHECK(CSSProperty::Get(resolveCSSPropertyID(unresolved_property))
-                 .IsEnabled());
-#endif
-      // Now "all" is used by both CSSValue and CSSPropertyValue.
-      // Need to return nullptr when currentValue is CSSPropertyID::kAll.
-      if (unresolved_property == CSSPropertyID::kWillChange ||
-          unresolved_property == CSSPropertyID::kAll)
-        return nullptr;
-      values->Append(
-          *MakeGarbageCollected<CSSCustomIdentValue>(unresolved_property));
-      range.ConsumeIncludingWhitespace();
-    } else {
-      switch (range.Peek().Id()) {
-        case CSSValueID::kNone:
-        case CSSValueID::kAll:
-        case CSSValueID::kAuto:
-        case CSSValueID::kDefault:
-        case CSSValueID::kInitial:
-        case CSSValueID::kInherit:
-          return nullptr;
-        case CSSValueID::kContents:
-        case CSSValueID::kScrollPosition:
-          values->Append(*css_property_parser_helpers::ConsumeIdent(range));
-          break;
-        default:
-          range.ConsumeIncludingWhitespace();
-          break;
-      }
-    }
-
-    if (range.AtEnd())
-      break;
-    if (!css_property_parser_helpers::ConsumeCommaIncludingWhitespace(range))
-      return nullptr;
-  }
-
-  return values;
-}
-
-const CSSValue* WillChange::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForWillChange(
-      style.WillChangeProperties(), style.WillChangeContents(),
-      style.WillChangeScrollPosition());
-}
-
-void WillChange::ApplyInitial(StyleResolverState& state) const {
-  state.Style()->SetWillChangeContents(false);
-  state.Style()->SetWillChangeScrollPosition(false);
-  state.Style()->SetWillChangeProperties(Vector<CSSPropertyID>());
-  state.Style()->SetSubtreeWillChangeContents(
-      state.ParentStyle()->SubtreeWillChangeContents());
-}
-
-void WillChange::ApplyInherit(StyleResolverState& state) const {
-  state.Style()->SetWillChangeContents(
-      state.ParentStyle()->WillChangeContents());
-  state.Style()->SetWillChangeScrollPosition(
-      state.ParentStyle()->WillChangeScrollPosition());
-  state.Style()->SetWillChangeProperties(
-      state.ParentStyle()->WillChangeProperties());
-  state.Style()->SetSubtreeWillChangeContents(
-      state.ParentStyle()->SubtreeWillChangeContents());
-}
-
-void WillChange::ApplyValue(StyleResolverState& state,
-                            const CSSValue& value) const {
-  bool will_change_contents = false;
-  bool will_change_scroll_position = false;
-  Vector<CSSPropertyID> will_change_properties;
-
-  if (auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    DCHECK_EQ(identifier_value->GetValueID(), CSSValueID::kAuto);
-  } else {
-    for (auto& will_change_value : To<CSSValueList>(value)) {
-      if (auto* ident_value =
-              DynamicTo<CSSCustomIdentValue>(will_change_value.Get())) {
-        will_change_properties.push_back(ident_value->ValueAsPropertyID());
-      } else if (To<CSSIdentifierValue>(*will_change_value).GetValueID() ==
-                 CSSValueID::kContents) {
-        will_change_contents = true;
-      } else if (To<CSSIdentifierValue>(*will_change_value).GetValueID() ==
-                 CSSValueID::kScrollPosition) {
-        will_change_scroll_position = true;
-      } else {
-        NOTREACHED();
-      }
-    }
-  }
-  state.Style()->SetWillChangeContents(will_change_contents);
-  state.Style()->SetWillChangeScrollPosition(will_change_scroll_position);
-  state.Style()->SetWillChangeProperties(will_change_properties);
-  state.Style()->SetSubtreeWillChangeContents(
-      will_change_contents || state.ParentStyle()->SubtreeWillChangeContents());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/word_break_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/word_break_custom.cc
deleted file mode 100644
index e1ebe16..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/word_break_custom.cc
+++ /dev/null
@@ -1,20 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/word_break.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WordBreak::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.WordBreak());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/word_spacing_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/word_spacing_custom.cc
deleted file mode 100644
index 8c0b3067..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/word_spacing_custom.cc
+++ /dev/null
@@ -1,30 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/word_spacing.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WordSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return css_parsing_utils::ParseSpacing(range, context);
-}
-
-const CSSValue* WordSpacing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ZoomAdjustedPixelValue(style.WordSpacing(), style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/writing_mode_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/writing_mode_custom.cc
deleted file mode 100644
index 26f8fd9..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/writing_mode_custom.cc
+++ /dev/null
@@ -1,26 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/writing_mode.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* WritingMode::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSIdentifierValue::Create(style.GetWritingMode());
-}
-
-void WritingMode::ApplyValue(StyleResolverState& state,
-                             const CSSValue& value) const {
-  state.SetWritingMode(
-      To<CSSIdentifierValue>(value).ConvertTo<blink::WritingMode>());
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/x_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/x_custom.cc
deleted file mode 100644
index 2716601..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/x_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/x.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* X::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext& context,
-                                    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeAll);
-}
-
-const CSSValue* X::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.X(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/y_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/y_custom.cc
deleted file mode 100644
index eaa456c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/y_custom.cc
+++ /dev/null
@@ -1,31 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/y.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Y::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext& context,
-                                    const CSSParserLocalContext&) const {
-  return css_property_parser_helpers::ConsumeSVGGeometryPropertyLength(
-      range, context, kValueRangeAll);
-}
-
-const CSSValue* Y::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle& svg_style,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ZoomAdjustedPixelValueForLength(svg_style.Y(),
-                                                             style);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/z_index_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/z_index_custom.cc
deleted file mode 100644
index 486675c..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/z_index_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/z_index.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* ZIndex::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueID::kAuto)
-    return css_property_parser_helpers::ConsumeIdent(range);
-  return css_property_parser_helpers::ConsumeInteger(range);
-}
-
-const CSSValue* ZIndex::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  if (style.HasAutoZIndex() || !style.IsStackingContext())
-    return CSSIdentifierValue::Create(CSSValueID::kAuto);
-  return CSSPrimitiveValue::Create(style.ZIndex(),
-                                   CSSPrimitiveValue::UnitType::kInteger);
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/longhands/zoom_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/zoom_custom.cc
deleted file mode 100644
index 1a8f7ee..0000000
--- a/third_party/blink/renderer/core/css/properties/longhands/zoom_custom.cc
+++ /dev/null
@@ -1,84 +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.
-
-#include "third_party/blink/renderer/core/css/properties/longhands/zoom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/frame/use_counter.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_longhand {
-
-const CSSValue* Zoom::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  const CSSParserToken& token = range.Peek();
-  CSSValue* zoom = nullptr;
-  if (token.GetType() == kIdentToken) {
-    zoom =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kNormal>(range);
-  } else {
-    zoom = css_property_parser_helpers::ConsumePercent(range,
-                                                       kValueRangeNonNegative);
-    if (!zoom) {
-      zoom = css_property_parser_helpers::ConsumeNumber(range,
-                                                        kValueRangeNonNegative);
-    }
-  }
-  if (zoom) {
-    if (!(token.Id() == CSSValueID::kNormal ||
-          (token.GetType() == kNumberToken &&
-           To<CSSPrimitiveValue>(zoom)->GetDoubleValue() == 1) ||
-          (token.GetType() == kPercentageToken &&
-           To<CSSPrimitiveValue>(zoom)->GetDoubleValue() == 100)))
-      context.Count(WebFeature::kCSSZoomNotEqualToOne);
-  }
-  return zoom;
-}
-
-const CSSValue* Zoom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return CSSPrimitiveValue::Create(style.Zoom(),
-                                   CSSPrimitiveValue::UnitType::kNumber);
-}
-
-void Zoom::ApplyInitial(StyleResolverState& state) const {
-  state.SetZoom(ComputedStyleInitialValues::InitialZoom());
-}
-
-void Zoom::ApplyInherit(StyleResolverState& state) const {
-  state.SetZoom(state.ParentStyle()->Zoom());
-}
-
-void Zoom::ApplyValue(StyleResolverState& state, const CSSValue& value) const {
-  SECURITY_DCHECK(value.IsPrimitiveValue() || value.IsIdentifierValue());
-
-  if (const auto* identifier_value = DynamicTo<CSSIdentifierValue>(value)) {
-    if (identifier_value->GetValueID() == CSSValueID::kNormal) {
-      state.SetZoom(ComputedStyleInitialValues::InitialZoom());
-    }
-  } else if (const auto* primitive_value =
-                 DynamicTo<CSSPrimitiveValue>(value)) {
-    if (primitive_value->IsPercentage()) {
-      if (float percent = primitive_value->GetFloatValue())
-        state.SetZoom(percent / 100.0f);
-      else
-        state.SetZoom(1.0f);
-    } else if (primitive_value->IsNumber()) {
-      if (float number = primitive_value->GetFloatValue())
-        state.SetZoom(number);
-      else
-        state.SetZoom(1.0f);
-    }
-  }
-}
-
-}  // namespace css_longhand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/animation_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/animation_custom.cc
deleted file mode 100644
index fa01620..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/animation_custom.cc
+++ /dev/null
@@ -1,143 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/animation.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace {
-
-// Legacy parsing allows <string>s for animation-name.
-CSSValue* ConsumeAnimationValue(CSSPropertyID property,
-                                CSSParserTokenRange& range,
-                                const CSSParserContext& context,
-                                bool use_legacy_parsing) {
-  switch (property) {
-    case CSSPropertyID::kAnimationDelay:
-      return css_property_parser_helpers::ConsumeTime(range, kValueRangeAll);
-    case CSSPropertyID::kAnimationDirection:
-      return css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kNormal, CSSValueID::kAlternate, CSSValueID::kReverse,
-          CSSValueID::kAlternateReverse>(range);
-    case CSSPropertyID::kAnimationDuration:
-      return css_property_parser_helpers::ConsumeTime(range,
-                                                      kValueRangeNonNegative);
-    case CSSPropertyID::kAnimationFillMode:
-      return css_property_parser_helpers::ConsumeIdent<
-          CSSValueID::kNone, CSSValueID::kForwards, CSSValueID::kBackwards,
-          CSSValueID::kBoth>(range);
-    case CSSPropertyID::kAnimationIterationCount:
-      return css_parsing_utils::ConsumeAnimationIterationCount(range);
-    case CSSPropertyID::kAnimationName:
-      return css_parsing_utils::ConsumeAnimationName(range, context,
-                                                     use_legacy_parsing);
-    case CSSPropertyID::kAnimationPlayState:
-      return css_property_parser_helpers::ConsumeIdent<CSSValueID::kRunning,
-                                                       CSSValueID::kPaused>(
-          range);
-    case CSSPropertyID::kAnimationTimingFunction:
-      return css_parsing_utils::ConsumeAnimationTimingFunction(range);
-    default:
-      NOTREACHED();
-      return nullptr;
-  }
-}
-
-}  // namespace
-namespace css_shorthand {
-
-bool Animation::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const StylePropertyShorthand shorthand = animationShorthandForParsing();
-  const unsigned longhand_count = shorthand.length();
-
-  HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
-      longhands(longhand_count);
-  if (!css_parsing_utils::ConsumeAnimationShorthand(
-          shorthand, longhands, ConsumeAnimationValue, range, context,
-          local_context.UseAliasParsing())) {
-    return false;
-  }
-
-  for (unsigned i = 0; i < longhand_count; ++i) {
-    css_property_parser_helpers::AddProperty(
-        shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-  return range.AtEnd();
-}
-
-const CSSValue* Animation::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const CSSAnimationData* animation_data = style.Animations();
-  if (animation_data) {
-    CSSValueList* animations_list = CSSValueList::CreateCommaSeparated();
-    for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) {
-      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-      list->Append(*CSSPrimitiveValue::Create(
-          CSSTimingData::GetRepeated(animation_data->DurationList(), i),
-          CSSPrimitiveValue::UnitType::kSeconds));
-      list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
-          CSSTimingData::GetRepeated(animation_data->TimingFunctionList(), i)
-              .get()));
-      list->Append(*CSSPrimitiveValue::Create(
-          CSSTimingData::GetRepeated(animation_data->DelayList(), i),
-          CSSPrimitiveValue::UnitType::kSeconds));
-      list->Append(*ComputedStyleUtils::ValueForAnimationIterationCount(
-          CSSTimingData::GetRepeated(animation_data->IterationCountList(), i)));
-      list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
-          CSSTimingData::GetRepeated(animation_data->DirectionList(), i)));
-      list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
-          CSSTimingData::GetRepeated(animation_data->FillModeList(), i)));
-      list->Append(*ComputedStyleUtils::ValueForAnimationPlayState(
-          CSSTimingData::GetRepeated(animation_data->PlayStateList(), i)));
-      list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
-          animation_data->NameList()[i]));
-      animations_list->Append(*list);
-    }
-    return animations_list;
-  }
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  // animation-name default value.
-  list->Append(*CSSIdentifierValue::Create(CSSValueID::kNone));
-  list->Append(
-      *CSSPrimitiveValue::Create(CSSAnimationData::InitialDuration(),
-                                 CSSPrimitiveValue::UnitType::kSeconds));
-  list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
-      CSSAnimationData::InitialTimingFunction().get()));
-  list->Append(*CSSPrimitiveValue::Create(
-      CSSAnimationData::InitialDelay(), CSSPrimitiveValue::UnitType::kSeconds));
-  list->Append(
-      *CSSPrimitiveValue::Create(CSSAnimationData::InitialIterationCount(),
-                                 CSSPrimitiveValue::UnitType::kNumber));
-  list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
-      CSSAnimationData::InitialDirection()));
-  list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
-      CSSAnimationData::InitialFillMode()));
-  // Initial animation-play-state.
-  list->Append(*CSSIdentifierValue::Create(CSSValueID::kRunning));
-  return list;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/background_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/background_custom.cc
deleted file mode 100644
index a0cd224..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/background_custom.cc
+++ /dev/null
@@ -1,35 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/background.h"
-
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Background::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
-                                                  local_context, properties);
-}
-
-const CSSValue* Background::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForBackgroundShorthand(
-      style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/background_position_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/background_position_custom.cc
deleted file mode 100644
index d993420..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/background_position_custom.cc
+++ /dev/null
@@ -1,56 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/background_position.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BackgroundPosition::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* result_x = nullptr;
-  CSSValue* result_y = nullptr;
-
-  if (!css_parsing_utils::ConsumeBackgroundPosition(
-          range, context, css_property_parser_helpers::UnitlessQuirk::kAllow,
-          result_x, result_y) ||
-      !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBackgroundPositionX, CSSPropertyID::kBackgroundPosition,
-      *result_x, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBackgroundPositionY, CSSPropertyID::kBackgroundPosition,
-      *result_y, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* BackgroundPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
-      *this, style, &style.BackgroundLayers());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/background_repeat_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/background_repeat_custom.cc
deleted file mode 100644
index c7ea6f0..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/background_repeat_custom.cc
+++ /dev/null
@@ -1,59 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/background_repeat.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BackgroundRepeat::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* result_x = nullptr;
-  CSSValue* result_y = nullptr;
-  bool implicit = false;
-  if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
-                                             implicit) ||
-      !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBackgroundRepeatX, CSSPropertyID::kBackgroundRepeat,
-      *result_x, important,
-      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
-               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBackgroundRepeatY, CSSPropertyID::kBackgroundRepeat,
-      *result_y, important,
-      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
-               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* BackgroundRepeat::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
-      &style.BackgroundLayers());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_color_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_color_custom.cc
deleted file mode 100644
index 1304f37..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_color_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlockColor::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderBlockColorShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderBlockColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderBlockColorShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_custom.cc
deleted file mode 100644
index a9fb8a5..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const CSSValue* width = nullptr;
-  const CSSValue* style = nullptr;
-  const CSSValue* color = nullptr;
-
-  if (!css_property_parser_helpers::ConsumeBorderShorthand(
-          range, context, width, style, color)) {
-    return false;
-  };
-
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderBlockWidth, *width, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderBlockStyle, *style, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderBlockColor, *color, important, properties);
-
-  return range.AtEnd();
-}
-
-const CSSValue* BorderBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const CSSValue* value_start =
-      GetCSSPropertyBorderBlockStart().CSSValueFromComputedStyle(
-          style, layout_object, styled_node, allow_visited_style);
-  const CSSValue* value_end =
-      GetCSSPropertyBorderBlockEnd().CSSValueFromComputedStyle(
-          style, layout_object, styled_node, allow_visited_style);
-  if (!DataEquivalent(value_start, value_end)) {
-    return nullptr;
-  }
-  return value_start;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_end_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_end_custom.cc
deleted file mode 100644
index 78b27a6..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_end_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlockEnd::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderBlockEndShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_start_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_start_custom.cc
deleted file mode 100644
index 0b725a37..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_start_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlockStart::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderBlockStartShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_style_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_style_custom.cc
deleted file mode 100644
index 66ad0ee..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_style_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_style.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlockStyle::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderBlockStyleShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderBlockStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderBlockStyleShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_block_width_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_block_width_custom.cc
deleted file mode 100644
index bde08ce8..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_block_width_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBlockWidth::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderBlockWidthShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderBlockWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderBlockWidthShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_bottom_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_bottom_custom.cc
deleted file mode 100644
index 1c27bc3..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_bottom_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_bottom.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderBottom::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderBottomShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderBottom::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      borderBottomShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_color_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_color_custom.cc
deleted file mode 100644
index 92abd04..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_color_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderColor::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      borderColorShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      borderColorShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_custom.cc
deleted file mode 100644
index e570304e..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_custom.cc
+++ /dev/null
@@ -1,67 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border.h"
-
-#include "base/stl_util.h"
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Border::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const CSSValue* width = nullptr;
-  const CSSValue* style = nullptr;
-  const CSSValue* color = nullptr;
-
-  if (!css_property_parser_helpers::ConsumeBorderShorthand(
-          range, context, width, style, color)) {
-    return false;
-  };
-
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderWidth, *width, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderStyle, *style, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderColor, *color, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderImage, *CSSInitialValue::Create(), important,
-      properties);
-
-  return range.AtEnd();
-}
-
-const CSSValue* Border::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const CSSValue* value = GetCSSPropertyBorderTop().CSSValueFromComputedStyle(
-      style, layout_object, styled_node, allow_visited_style);
-  static const CSSProperty* kProperties[3] = {&GetCSSPropertyBorderRight(),
-                                              &GetCSSPropertyBorderBottom(),
-                                              &GetCSSPropertyBorderLeft()};
-  for (size_t i = 0; i < base::size(kProperties); ++i) {
-    const CSSValue* value_for_side = kProperties[i]->CSSValueFromComputedStyle(
-        style, layout_object, styled_node, allow_visited_style);
-    if (!DataEquivalent(value, value_for_side)) {
-      return nullptr;
-    }
-  }
-  return value;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_image_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_image_custom.cc
deleted file mode 100644
index 0532eb85..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_image_custom.cc
+++ /dev/null
@@ -1,83 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_image.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/properties/longhand.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderImage::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* source = nullptr;
-  CSSValue* slice = nullptr;
-  CSSValue* width = nullptr;
-  CSSValue* outset = nullptr;
-  CSSValue* repeat = nullptr;
-
-  if (!css_parsing_utils::ConsumeBorderImageComponents(
-          range, context, source, slice, width, outset, repeat,
-          css_parsing_utils::DefaultFill::kNoFill)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderImageSource, CSSPropertyID::kBorderImage,
-      source
-          ? *source
-          : *To<Longhand>(&GetCSSPropertyBorderImageSource())->InitialValue(),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderImageSlice, CSSPropertyID::kBorderImage,
-      slice ? *slice
-            : *To<Longhand>(&GetCSSPropertyBorderImageSlice())->InitialValue(),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderImageWidth, CSSPropertyID::kBorderImage,
-      width ? *width
-            : *To<Longhand>(&GetCSSPropertyBorderImageWidth())->InitialValue(),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderImageOutset, CSSPropertyID::kBorderImage,
-      outset
-          ? *outset
-          : *To<Longhand>(&GetCSSPropertyBorderImageOutset())->InitialValue(),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderImageRepeat, CSSPropertyID::kBorderImage,
-      repeat
-          ? *repeat
-          : *To<Longhand>(&GetCSSPropertyBorderImageRepeat())->InitialValue(),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* BorderImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImage(style.BorderImage(), style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_color_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_color_custom.cc
deleted file mode 100644
index 675514b..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_color_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_color.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInlineColor::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderInlineColorShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderInlineColor::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderInlineColorShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_custom.cc
deleted file mode 100644
index ff13c02..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const CSSValue* width = nullptr;
-  const CSSValue* style = nullptr;
-  const CSSValue* color = nullptr;
-
-  if (!css_property_parser_helpers::ConsumeBorderShorthand(
-          range, context, width, style, color)) {
-    return false;
-  };
-
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderInlineWidth, *width, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderInlineStyle, *style, important, properties);
-  css_property_parser_helpers::AddExpandedPropertyForValue(
-      CSSPropertyID::kBorderInlineColor, *color, important, properties);
-
-  return range.AtEnd();
-}
-
-const CSSValue* BorderInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const CSSValue* value_start =
-      GetCSSPropertyBorderInlineStart().CSSValueFromComputedStyle(
-          style, layout_object, styled_node, allow_visited_style);
-  const CSSValue* value_end =
-      GetCSSPropertyBorderInlineEnd().CSSValueFromComputedStyle(
-          style, layout_object, styled_node, allow_visited_style);
-  if (!DataEquivalent(value_start, value_end)) {
-    return nullptr;
-  }
-  return value_start;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_end_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_end_custom.cc
deleted file mode 100644
index bac8986..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_end_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_end.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInlineEnd::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderInlineEndShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_start_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_start_custom.cc
deleted file mode 100644
index 28a3635..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_start_custom.cc
+++ /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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_start.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInlineStart::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderInlineStartShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_style_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_style_custom.cc
deleted file mode 100644
index c559d95..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_style_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_style.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInlineStyle::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderInlineStyleShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderInlineStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderInlineStyleShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_width_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_inline_width_custom.cc
deleted file mode 100644
index 76577f27..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_inline_width_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderInlineWidth::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      borderInlineWidthShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderInlineWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      borderInlineWidthShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_left_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_left_custom.cc
deleted file mode 100644
index af9b336c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_left_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_left.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderLeft::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderLeftShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderLeft::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      borderLeftShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_radius_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_radius_custom.cc
deleted file mode 100644
index 1bf00de..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_radius_custom.cc
+++ /dev/null
@@ -1,73 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_radius.h"
-
-#include "third_party/blink/renderer/core/css/css_value_pair.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderRadius::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* horizontal_radii[4] = {nullptr};
-  CSSValue* vertical_radii[4] = {nullptr};
-
-  if (!css_parsing_utils::ConsumeRadii(horizontal_radii, vertical_radii, range,
-                                       context.Mode(),
-                                       local_context.UseAliasParsing()))
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderTopLeftRadius, CSSPropertyID::kBorderRadius,
-      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[0],
-                                          vertical_radii[0],
-                                          CSSValuePair::kDropIdenticalValues),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderTopRightRadius, CSSPropertyID::kBorderRadius,
-      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[1],
-                                          vertical_radii[1],
-                                          CSSValuePair::kDropIdenticalValues),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderBottomRightRadius, CSSPropertyID::kBorderRadius,
-      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[2],
-                                          vertical_radii[2],
-                                          CSSValuePair::kDropIdenticalValues),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBorderBottomLeftRadius, CSSPropertyID::kBorderRadius,
-      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[3],
-                                          vertical_radii[3],
-                                          CSSValuePair::kDropIdenticalValues),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* BorderRadius::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForBorderRadiusShorthand(style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_right_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_right_custom.cc
deleted file mode 100644
index 0075cff9..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_right_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_right.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderRight::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderRightShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderRight::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      borderRightShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_spacing_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_spacing_custom.cc
deleted file mode 100644
index 906da1dd..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_spacing_custom.cc
+++ /dev/null
@@ -1,60 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_spacing.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderSpacing::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* horizontal_spacing =
-      ConsumeLength(range, context.Mode(), kValueRangeNonNegative,
-                    css_property_parser_helpers::UnitlessQuirk::kAllow);
-  if (!horizontal_spacing)
-    return false;
-  CSSValue* vertical_spacing = horizontal_spacing;
-  if (!range.AtEnd()) {
-    vertical_spacing =
-        ConsumeLength(range, context.Mode(), kValueRangeNonNegative,
-                      css_property_parser_helpers::UnitlessQuirk::kAllow);
-  }
-  if (!vertical_spacing || !range.AtEnd())
-    return false;
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitBorderHorizontalSpacing,
-      CSSPropertyID::kBorderSpacing, *horizontal_spacing, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitBorderVerticalSpacing,
-      CSSPropertyID::kBorderSpacing, *vertical_spacing, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* BorderSpacing::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*ZoomAdjustedPixelValue(style.HorizontalBorderSpacing(), style));
-  list->Append(*ZoomAdjustedPixelValue(style.VerticalBorderSpacing(), style));
-  return list;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_style_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_style_custom.cc
deleted file mode 100644
index bbbd07c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_style_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_style.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderStyle::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      borderStyleShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      borderStyleShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_top_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_top_custom.cc
deleted file mode 100644
index 1dd99d0..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_top_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_top.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderTop::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      borderTopShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderTop::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      borderTopShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/border_width_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/border_width_custom.cc
deleted file mode 100644
index 7d8b7b3..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/border_width_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/border_width.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool BorderWidth::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      borderWidthShorthand(), important, context, range, properties);
-}
-
-const CSSValue* BorderWidth::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      borderWidthShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/column_rule_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/column_rule_custom.cc
deleted file mode 100644
index 7f05677..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/column_rule_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/column_rule.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ColumnRule::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      columnRuleShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ColumnRule::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      columnRuleShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/columns_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/columns_custom.cc
deleted file mode 100644
index dc7aa4c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/columns_custom.cc
+++ /dev/null
@@ -1,60 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/columns.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Columns::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* column_width = nullptr;
-  CSSValue* column_count = nullptr;
-  if (!css_parsing_utils::ConsumeColumnWidthOrCount(range, column_width,
-                                                    column_count))
-    return false;
-  css_parsing_utils::ConsumeColumnWidthOrCount(range, column_width,
-                                               column_count);
-  if (!range.AtEnd())
-    return false;
-  if (!column_width)
-    column_width = CSSIdentifierValue::Create(CSSValueID::kAuto);
-  if (!column_count)
-    column_count = CSSIdentifierValue::Create(CSSValueID::kAuto);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kColumnWidth, CSSPropertyID::kInvalid, *column_width,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kColumnCount, CSSPropertyID::kInvalid, *column_count,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* Columns::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      columnsShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/flex_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/flex_custom.cc
deleted file mode 100644
index 562c26a..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/flex_custom.cc
+++ /dev/null
@@ -1,110 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/flex.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Flex::ParseShorthand(bool important,
-                          CSSParserTokenRange& range,
-                          const CSSParserContext& context,
-                          const CSSParserLocalContext&,
-                          HeapVector<CSSPropertyValue, 256>& properties) const {
-  static const double kUnsetValue = -1;
-  double flex_grow = kUnsetValue;
-  double flex_shrink = kUnsetValue;
-  CSSValue* flex_basis = nullptr;
-
-  if (range.Peek().Id() == CSSValueID::kNone) {
-    flex_grow = 0;
-    flex_shrink = 0;
-    flex_basis = CSSIdentifierValue::Create(CSSValueID::kAuto);
-    range.ConsumeIncludingWhitespace();
-  } else {
-    unsigned index = 0;
-    while (!range.AtEnd() && index++ < 3) {
-      double num;
-      if (css_property_parser_helpers::ConsumeNumberRaw(range, num)) {
-        if (num < 0)
-          return false;
-        if (flex_grow == kUnsetValue) {
-          flex_grow = num;
-        } else if (flex_shrink == kUnsetValue) {
-          flex_shrink = num;
-        } else if (!num) {
-          // flex only allows a basis of 0 (sans units) if
-          // flex-grow and flex-shrink values have already been
-          // set.
-          flex_basis = CSSPrimitiveValue::Create(
-              0, CSSPrimitiveValue::UnitType::kPixels);
-        } else {
-          return false;
-        }
-      } else if (!flex_basis) {
-        if (range.Peek().Id() == CSSValueID::kAuto)
-          flex_basis = css_property_parser_helpers::ConsumeIdent(range);
-        if (!flex_basis) {
-          flex_basis = css_property_parser_helpers::ConsumeLengthOrPercent(
-              range, context.Mode(), kValueRangeNonNegative);
-        }
-        if (index == 2 && !range.AtEnd())
-          return false;
-      }
-    }
-    if (index == 0)
-      return false;
-    if (flex_grow == kUnsetValue)
-      flex_grow = 1;
-    if (flex_shrink == kUnsetValue)
-      flex_shrink = 1;
-    if (!flex_basis) {
-      flex_basis = CSSPrimitiveValue::Create(
-          0, CSSPrimitiveValue::UnitType::kPercentage);
-    }
-  }
-
-  if (!range.AtEnd())
-    return false;
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFlexGrow, CSSPropertyID::kFlex,
-      *CSSPrimitiveValue::Create(clampTo<float>(flex_grow),
-                                 CSSPrimitiveValue::UnitType::kNumber),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFlexShrink, CSSPropertyID::kFlex,
-      *CSSPrimitiveValue::Create(clampTo<float>(flex_shrink),
-                                 CSSPrimitiveValue::UnitType::kNumber),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFlexBasis, CSSPropertyID::kFlex, *flex_basis, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* Flex::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      flexShorthand(), style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/flex_flow_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/flex_flow_custom.cc
deleted file mode 100644
index 4289d1d..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/flex_flow_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/flex_flow.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool FlexFlow::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      flexFlowShorthand(), important, context, range, properties);
-}
-
-const CSSValue* FlexFlow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      flexFlowShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/font_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/font_custom.cc
deleted file mode 100644
index 52e7377..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/font_custom.cc
+++ /dev/null
@@ -1,259 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/font.h"
-
-#include "third_party/blink/renderer/core/css/css_font_family_value.h"
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
-#include "third_party/blink/renderer/core/css/css_property_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_fast_paths.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_theme.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace {
-
-bool ConsumeSystemFont(bool important,
-                       CSSParserTokenRange& range,
-                       HeapVector<CSSPropertyValue, 256>& properties) {
-  CSSValueID system_font_id = range.ConsumeIncludingWhitespace().Id();
-  DCHECK_GE(system_font_id, CSSValueID::kCaption);
-  DCHECK_LE(system_font_id, CSSValueID::kStatusBar);
-  if (!range.AtEnd())
-    return false;
-
-  FontSelectionValue font_style = NormalSlopeValue();
-  FontSelectionValue font_weight = NormalWeightValue();
-  float font_size = 0;
-  AtomicString font_family;
-  LayoutTheme::GetTheme().SystemFont(system_font_id, font_style, font_weight,
-                                     font_size, font_family);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(font_style == ItalicSlopeValue()
-                                      ? CSSValueID::kItalic
-                                      : CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
-      *CSSPrimitiveValue::Create(font_weight,
-                                 CSSPrimitiveValue::UnitType::kNumber),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontSize, CSSPropertyID::kFont,
-      *CSSPrimitiveValue::Create(font_size,
-                                 CSSPrimitiveValue::UnitType::kPixels),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  CSSValueList* font_family_list = CSSValueList::CreateCommaSeparated();
-  font_family_list->Append(*CSSFontFamilyValue::Create(font_family));
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *font_family_list,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-bool ConsumeFont(bool important,
-                 CSSParserTokenRange& range,
-                 const CSSParserContext& context,
-                 HeapVector<CSSPropertyValue, 256>& properties) {
-  // Optional font-style, font-variant, font-stretch and font-weight.
-  CSSValue* font_style = nullptr;
-  CSSIdentifierValue* font_variant_caps = nullptr;
-  CSSValue* font_weight = nullptr;
-  CSSValue* font_stretch = nullptr;
-  while (!range.AtEnd()) {
-    CSSValueID id = range.Peek().Id();
-    if (!font_style &&
-        (id == CSSValueID::kNormal || id == CSSValueID::kItalic ||
-         id == CSSValueID::kOblique)) {
-      font_style = css_parsing_utils::ConsumeFontStyle(range, context.Mode());
-      if (!font_style)
-        return false;
-      continue;
-    }
-    if (!font_variant_caps &&
-        (id == CSSValueID::kNormal || id == CSSValueID::kSmallCaps)) {
-      // Font variant in the shorthand is particular, it only accepts normal or
-      // small-caps.
-      // See https://drafts.csswg.org/css-fonts/#propdef-font
-      font_variant_caps = css_parsing_utils::ConsumeFontVariantCSS21(range);
-      if (font_variant_caps)
-        continue;
-    }
-    if (!font_weight) {
-      font_weight = css_parsing_utils::ConsumeFontWeight(range, context.Mode());
-      if (font_weight)
-        continue;
-    }
-    // Stretch in the font shorthand can only take the CSS Fonts Level 3
-    // keywords, not arbitrary values, compare
-    // https://drafts.csswg.org/css-fonts-4/#font-prop
-    // Bail out if the last possible property of the set in this loop could not
-    // be parsed, this closes the first block of optional values of the font
-    // shorthand, compare: [ [ <‘font-style’> || <font-variant-css21> ||
-    // <‘font-weight’> || <font-stretch-css3> ]?
-    if (font_stretch ||
-        !(font_stretch =
-              css_parsing_utils::ConsumeFontStretchKeywordOnly(range)))
-      break;
-  }
-
-  if (range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
-      font_style ? *font_style
-                 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
-      font_variant_caps ? *font_variant_caps
-                        : *CSSIdentifierValue::Create(CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
-      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
-      font_weight ? *font_weight
-                  : *CSSIdentifierValue::Create(CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
-      font_stretch ? *font_stretch
-                   : *CSSIdentifierValue::Create(CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  // Now a font size _must_ come.
-  CSSValue* font_size =
-      css_parsing_utils::ConsumeFontSize(range, context.Mode());
-  if (!font_size || range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontSize, CSSPropertyID::kFont, *font_size, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-    CSSValue* line_height =
-        css_parsing_utils::ConsumeLineHeight(range, context.Mode());
-    if (!line_height)
-      return false;
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kLineHeight, CSSPropertyID::kFont, *line_height,
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
-        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  // Font family must come now.
-  CSSValue* parsed_family_value = css_parsing_utils::ConsumeFontFamily(range);
-  if (!parsed_family_value)
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *parsed_family_value,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requires
-  // that "font-stretch", "font-size-adjust", and "font-kerning" be reset to
-  // their initial values but we don't seem to support them at the moment. They
-  // should also be added here once implemented.
-  return range.AtEnd();
-}
-
-}  // namespace
-namespace css_shorthand {
-
-bool Font::ParseShorthand(bool important,
-                          CSSParserTokenRange& range,
-                          const CSSParserContext& context,
-                          const CSSParserLocalContext&,
-                          HeapVector<CSSPropertyValue, 256>& properties) const {
-  const CSSParserToken& token = range.Peek();
-  if (token.Id() >= CSSValueID::kCaption &&
-      token.Id() <= CSSValueID::kStatusBar)
-    return ConsumeSystemFont(important, range, properties);
-  return ConsumeFont(important, range, context, properties);
-}
-
-const CSSValue* Font::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForFont(style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/font_variant_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/font_variant_custom.cc
deleted file mode 100644
index 5b122da7..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/font_variant_custom.cc
+++ /dev/null
@@ -1,130 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/font_variant.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_east_asian_parser.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_ligatures_parser.h"
-#include "third_party/blink/renderer/core/css/parser/font_variant_numeric_parser.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool FontVariant::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  if (css_property_parser_helpers::IdentMatches<CSSValueID::kNormal,
-                                                CSSValueID::kNone>(
-          range.Peek().Id())) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
-        *css_property_parser_helpers::ConsumeIdent(range), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
-        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
-        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
-        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    return range.AtEnd();
-  }
-
-  CSSIdentifierValue* caps_value = nullptr;
-  FontVariantLigaturesParser ligatures_parser;
-  FontVariantNumericParser numeric_parser;
-  FontVariantEastAsianParser east_asian_parser;
-  do {
-    FontVariantLigaturesParser::ParseResult ligatures_parse_result =
-        ligatures_parser.ConsumeLigature(range);
-    FontVariantNumericParser::ParseResult numeric_parse_result =
-        numeric_parser.ConsumeNumeric(range);
-    FontVariantEastAsianParser::ParseResult east_asian_parse_result =
-        east_asian_parser.ConsumeEastAsian(range);
-    if (ligatures_parse_result ==
-            FontVariantLigaturesParser::ParseResult::kConsumedValue ||
-        numeric_parse_result ==
-            FontVariantNumericParser::ParseResult::kConsumedValue ||
-        east_asian_parse_result ==
-            FontVariantEastAsianParser::ParseResult::kConsumedValue)
-      continue;
-
-    if (ligatures_parse_result ==
-            FontVariantLigaturesParser::ParseResult::kDisallowedValue ||
-        numeric_parse_result ==
-            FontVariantNumericParser::ParseResult::kDisallowedValue ||
-        east_asian_parse_result ==
-            FontVariantEastAsianParser::ParseResult::kDisallowedValue)
-      return false;
-
-    CSSValueID id = range.Peek().Id();
-    switch (id) {
-      case CSSValueID::kSmallCaps:
-      case CSSValueID::kAllSmallCaps:
-      case CSSValueID::kPetiteCaps:
-      case CSSValueID::kAllPetiteCaps:
-      case CSSValueID::kUnicase:
-      case CSSValueID::kTitlingCaps:
-        // Only one caps value permitted in font-variant grammar.
-        if (caps_value)
-          return false;
-        caps_value = css_property_parser_helpers::ConsumeIdent(range);
-        break;
-      default:
-        return false;
-    }
-  } while (!range.AtEnd());
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
-      *ligatures_parser.FinalizeValue(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
-      *numeric_parser.FinalizeValue(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
-      *east_asian_parser.FinalizeValue(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
-      caps_value ? *caps_value
-                 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* FontVariant::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForFontVariantProperty(
-      style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/gap_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/gap_custom.cc
deleted file mode 100644
index 2992c49..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/gap_custom.cc
+++ /dev/null
@@ -1,50 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Gap::ParseShorthand(bool important,
-                         CSSParserTokenRange& range,
-                         const CSSParserContext& context,
-                         const CSSParserLocalContext&,
-                         HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGap).length(), 2u);
-  CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
-  CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
-  if (!row_gap || !range.AtEnd())
-    return false;
-  if (!column_gap)
-    column_gap = row_gap;
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* Gap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      gapShorthand(), style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_area_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_area_custom.cc
deleted file mode 100644
index 105789f..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_area_custom.cc
+++ /dev/null
@@ -1,97 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_area.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridArea::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(gridAreaShorthand().length(), 4u);
-
-  CSSValue* row_start_value =
-      css_parsing_utils::ConsumeGridLine(range, context);
-  if (!row_start_value)
-    return false;
-  CSSValue* column_start_value = nullptr;
-  CSSValue* row_end_value = nullptr;
-  CSSValue* column_end_value = nullptr;
-  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-    column_start_value = css_parsing_utils::ConsumeGridLine(range, context);
-    if (!column_start_value)
-      return false;
-    if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-      row_end_value = css_parsing_utils::ConsumeGridLine(range, context);
-      if (!row_end_value)
-        return false;
-      if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-        column_end_value = css_parsing_utils::ConsumeGridLine(range, context);
-        if (!column_end_value)
-          return false;
-      }
-    }
-  }
-  if (!range.AtEnd())
-    return false;
-  if (!column_start_value) {
-    column_start_value = row_start_value->IsCustomIdentValue()
-                             ? row_start_value
-                             : CSSIdentifierValue::Create(CSSValueID::kAuto);
-  }
-  if (!row_end_value) {
-    row_end_value = row_start_value->IsCustomIdentValue()
-                        ? row_start_value
-                        : CSSIdentifierValue::Create(CSSValueID::kAuto);
-  }
-  if (!column_end_value) {
-    column_end_value = column_start_value->IsCustomIdentValue()
-                           ? column_start_value
-                           : CSSIdentifierValue::Create(CSSValueID::kAuto);
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridRowStart, CSSPropertyID::kGridArea, *row_start_value,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridColumnStart, CSSPropertyID::kGridArea,
-      *column_start_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridRowEnd, CSSPropertyID::kGridArea, *row_end_value,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridColumnEnd, CSSPropertyID::kGridArea,
-      *column_end_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* GridArea::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForGridShorthand(gridAreaShorthand(), style,
-                                                    layout_object, styled_node,
-                                                    allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_column_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_column_custom.cc
deleted file mode 100644
index c73349e..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_column_custom.cc
+++ /dev/null
@@ -1,60 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_column.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridColumn::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const StylePropertyShorthand& shorthand =
-      shorthandForProperty(CSSPropertyID::kGridColumn);
-  DCHECK_EQ(shorthand.length(), 2u);
-
-  CSSValue* start_value = nullptr;
-  CSSValue* end_value = nullptr;
-  if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
-          important, range, context, start_value, end_value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridColumn,
-      *start_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridColumn,
-      *end_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* GridColumn::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForGridShorthand(
-      gridColumnShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_column_gap_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_column_gap_custom.cc
deleted file mode 100644
index a62bc27..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_column_gap_custom.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_column_gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridColumnGap::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
-  if (!gap_length || !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kColumnGap, CSSPropertyID::kGridColumnGap, *gap_length,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* GridColumnGap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      gridColumnGapShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_custom.cc
deleted file mode 100644
index 722ad5d..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_custom.cc
+++ /dev/null
@@ -1,213 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace {
-
-CSSValueList* ConsumeImplicitAutoFlow(CSSParserTokenRange& range,
-                                      const CSSValue& flow_direction) {
-  // [ auto-flow && dense? ]
-  CSSValue* dense_algorithm = nullptr;
-  if ((css_property_parser_helpers::ConsumeIdent<CSSValueID::kAutoFlow>(
-          range))) {
-    dense_algorithm =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
-  } else {
-    dense_algorithm =
-        css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
-    if (!dense_algorithm)
-      return nullptr;
-    if (!css_property_parser_helpers::ConsumeIdent<CSSValueID::kAutoFlow>(
-            range))
-      return nullptr;
-  }
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(flow_direction);
-  if (dense_algorithm)
-    list->Append(*dense_algorithm);
-  return list;
-}
-
-}  // namespace
-namespace css_shorthand {
-
-bool Grid::ParseShorthand(bool important,
-                          CSSParserTokenRange& range,
-                          const CSSParserContext& context,
-                          const CSSParserLocalContext&,
-                          HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGrid).length(), 6u);
-
-  CSSParserTokenRange range_copy = range;
-
-  CSSValue* template_rows = nullptr;
-  CSSValue* template_columns = nullptr;
-  CSSValue* template_areas = nullptr;
-
-  if (css_parsing_utils::ConsumeGridTemplateShorthand(
-          important, range, context, template_rows, template_columns,
-          template_areas)) {
-    DCHECK(template_rows);
-    DCHECK(template_columns);
-    DCHECK(template_areas);
-
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
-        *template_columns, important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
-        *template_areas, important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-
-    // It can only be specified the explicit or the implicit grid properties in
-    // a single grid declaration. The sub-properties not specified are set to
-    // their initial value, as normal for shorthands.
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    return true;
-  }
-
-  range = range_copy;
-
-  CSSValue* auto_columns_value = nullptr;
-  CSSValue* auto_rows_value = nullptr;
-  CSSValueList* grid_auto_flow = nullptr;
-  template_rows = nullptr;
-  template_columns = nullptr;
-
-  if (css_property_parser_helpers::IdentMatches<CSSValueID::kDense,
-                                                CSSValueID::kAutoFlow>(
-          range.Peek().Id())) {
-    // 2- [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns>
-    grid_auto_flow = ConsumeImplicitAutoFlow(
-        range, *CSSIdentifierValue::Create(CSSValueID::kRow));
-    if (!grid_auto_flow)
-      return false;
-    if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-      auto_rows_value = CSSInitialValue::Create();
-    } else {
-      auto_rows_value = css_parsing_utils::ConsumeGridTrackList(
-          range, context, context.Mode(),
-          css_parsing_utils::TrackListType::kGridAuto);
-      if (!auto_rows_value)
-        return false;
-      if (!css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range))
-        return false;
-    }
-    if (!(template_columns =
-              css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(
-                  range, context, context.Mode())))
-      return false;
-    template_rows = CSSInitialValue::Create();
-    auto_columns_value = CSSInitialValue::Create();
-  } else {
-    // 3- <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>?
-    template_rows = css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(
-        range, context, context.Mode());
-    if (!template_rows)
-      return false;
-    if (!css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range))
-      return false;
-    grid_auto_flow = ConsumeImplicitAutoFlow(
-        range, *CSSIdentifierValue::Create(CSSValueID::kColumn));
-    if (!grid_auto_flow)
-      return false;
-    if (range.AtEnd()) {
-      auto_columns_value = CSSInitialValue::Create();
-    } else {
-      auto_columns_value = css_parsing_utils::ConsumeGridTrackList(
-          range, context, context.Mode(),
-          css_parsing_utils::TrackListType::kGridAuto);
-      if (!auto_columns_value)
-        return false;
-    }
-    template_columns = CSSInitialValue::Create();
-    auto_rows_value = CSSInitialValue::Create();
-  }
-
-  if (!range.AtEnd())
-    return false;
-
-  // It can only be specified the explicit or the implicit grid properties in a
-  // single grid declaration. The sub-properties not specified are set to their
-  // initial value, as normal for shorthands.
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
-      *template_columns, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
-      *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid, *grid_auto_flow,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
-      *auto_columns_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid, *auto_rows_value,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-bool Grid::IsLayoutDependent(const ComputedStyle* style,
-                             LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsLayoutGrid();
-}
-
-const CSSValue* Grid::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForGridShorthand(
-      gridShorthand(), style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_gap_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_gap_custom.cc
deleted file mode 100644
index 9757506..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_gap_custom.cc
+++ /dev/null
@@ -1,53 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridGap::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGridGap).length(), 2u);
-  CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
-  CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
-  if (!row_gap || !range.AtEnd())
-    return false;
-  if (!column_gap)
-    column_gap = row_gap;
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* GridGap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      gridGapShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_row_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_row_custom.cc
deleted file mode 100644
index 25ee58f..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_row_custom.cc
+++ /dev/null
@@ -1,60 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_row.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridRow::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const StylePropertyShorthand& shorthand =
-      shorthandForProperty(CSSPropertyID::kGridRow);
-  DCHECK_EQ(shorthand.length(), 2u);
-
-  CSSValue* start_value = nullptr;
-  CSSValue* end_value = nullptr;
-  if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
-          important, range, context, start_value, end_value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridRow,
-      *start_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridRow,
-      *end_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* GridRow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForGridShorthand(gridRowShorthand(), style,
-                                                    layout_object, styled_node,
-                                                    allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_row_gap_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_row_gap_custom.cc
deleted file mode 100644
index 8afab5d9..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_row_gap_custom.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_row_gap.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridRowGap::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
-  if (!gap_length || !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kRowGap, CSSPropertyID::kGridRowGap, *gap_length,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* GridRowGap::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      gridRowGapShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/grid_template_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/grid_template_custom.cc
deleted file mode 100644
index 1e07f6a6..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/grid_template_custom.cc
+++ /dev/null
@@ -1,72 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/grid_template.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool GridTemplate::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* template_rows = nullptr;
-  CSSValue* template_columns = nullptr;
-  CSSValue* template_areas = nullptr;
-  if (!css_parsing_utils::ConsumeGridTemplateShorthand(
-          important, range, context, template_rows, template_columns,
-          template_areas))
-    return false;
-
-  DCHECK(template_rows);
-  DCHECK(template_columns);
-  DCHECK(template_areas);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGridTemplate,
-      *template_rows, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGridTemplate,
-      *template_columns, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGridTemplate,
-      *template_areas, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-bool GridTemplate::IsLayoutDependent(const ComputedStyle* style,
-                                     LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsLayoutGrid();
-}
-
-const CSSValue* GridTemplate::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForGridShorthand(
-      gridTemplateShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/inset_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/inset_block_custom.cc
deleted file mode 100644
index 078558e..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/inset_block_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/inset_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool InsetBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      insetBlockShorthand(), important, context, range, properties);
-}
-
-const CSSValue* InsetBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      insetBlockShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/inset_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/inset_custom.cc
deleted file mode 100644
index d7cf29c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/inset_custom.cc
+++ /dev/null
@@ -1,36 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/inset.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Inset::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      insetShorthand(), important, context, range, properties);
-}
-
-const CSSValue* Inset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      insetShorthand(), style, layout_object, styled_node, allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/inset_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/inset_inline_custom.cc
deleted file mode 100644
index 7d04665..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/inset_inline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/inset_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool InsetInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      insetInlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* InsetInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      insetInlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/list_style_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/list_style_custom.cc
deleted file mode 100644
index 0c99adbf..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/list_style_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/list_style.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ListStyle::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      listStyleShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ListStyle::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      listStyleShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/margin_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/margin_block_custom.cc
deleted file mode 100644
index ffb1a79..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/margin_block_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/margin_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool MarginBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      marginBlockShorthand(), important, context, range, properties);
-}
-
-const CSSValue* MarginBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      marginBlockShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/margin_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/margin_custom.cc
deleted file mode 100644
index 03334831..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/margin_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/margin.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Margin::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      marginShorthand(), important, context, range, properties);
-}
-
-bool Margin::IsLayoutDependent(const ComputedStyle* style,
-                               LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->MarginBottom().IsFixed() ||
-          !style->MarginTop().IsFixed() || !style->MarginLeft().IsFixed() ||
-          !style->MarginRight().IsFixed());
-}
-
-const CSSValue* Margin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(marginShorthand(), style,
-                                                     layout_object, styled_node,
-                                                     allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/margin_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/margin_inline_custom.cc
deleted file mode 100644
index deb0ef9..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/margin_inline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/margin_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool MarginInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      marginInlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* MarginInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      marginInlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/marker_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/marker_custom.cc
deleted file mode 100644
index 4e45871b..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/marker_custom.cc
+++ /dev/null
@@ -1,39 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/marker.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Marker::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const CSSValue* marker = css_property_parser_helpers::ParseLonghand(
-      CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, context, range);
-  if (!marker || !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, *marker, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kMarkerMid, CSSPropertyID::kMarker, *marker, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kMarkerEnd, CSSPropertyID::kMarker, *marker, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/offset_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/offset_custom.cc
deleted file mode 100644
index d7c2153c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/offset_custom.cc
+++ /dev/null
@@ -1,145 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/offset.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/properties/longhand.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Offset::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  // TODO(meade): The propertyID parameter isn't used - it can be removed
-  // once all of the ParseSingleValue implementations have been moved to the
-  // CSSPropertys, and the base CSSProperty::ParseSingleValue contains
-  // no functionality.
-  const CSSValue* offset_position =
-      To<Longhand>(GetCSSPropertyOffsetPosition())
-          .ParseSingleValue(range, context, CSSParserLocalContext());
-  const CSSValue* offset_path =
-      css_parsing_utils::ConsumeOffsetPath(range, context);
-  const CSSValue* offset_distance = nullptr;
-  const CSSValue* offset_rotate = nullptr;
-  if (offset_path) {
-    offset_distance = css_property_parser_helpers::ConsumeLengthOrPercent(
-        range, context.Mode(), kValueRangeAll);
-    offset_rotate = css_parsing_utils::ConsumeOffsetRotate(range, context);
-    if (offset_rotate && !offset_distance) {
-      offset_distance = css_property_parser_helpers::ConsumeLengthOrPercent(
-          range, context.Mode(), kValueRangeAll);
-    }
-  }
-  const CSSValue* offset_anchor = nullptr;
-  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
-    offset_anchor =
-        To<Longhand>(GetCSSPropertyOffsetAnchor())
-            .ParseSingleValue(range, context, CSSParserLocalContext());
-    if (!offset_anchor)
-      return false;
-  }
-  if ((!offset_position && !offset_path) || !range.AtEnd())
-    return false;
-
-  if ((offset_position || offset_anchor) &&
-      !RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled())
-    return false;
-
-  if (offset_position) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
-        *offset_position, important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  if (offset_path) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset, *offset_path,
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  if (offset_distance) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
-        *offset_distance, important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  if (offset_rotate) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset, *offset_rotate,
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  if (offset_anchor) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset, *offset_anchor,
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset,
-        *CSSInitialValue::Create(), important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  return true;
-}
-
-const CSSValue* Offset::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForOffset(style, layout_object, styled_node,
-                                            allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/outline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/outline_custom.cc
deleted file mode 100644
index 48fc568b..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/outline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/outline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Outline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      outlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* Outline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      outlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/overflow_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/overflow_custom.cc
deleted file mode 100644
index 3717cb6..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/overflow_custom.cc
+++ /dev/null
@@ -1,41 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/overflow.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Overflow::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      overflowShorthand(), important, context, range, properties);
-}
-
-const CSSValue* Overflow::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*CSSIdentifierValue::Create(style.OverflowX()));
-  if (style.OverflowX() != style.OverflowY())
-    list->Append(*CSSIdentifierValue::Create(style.OverflowY()));
-
-  return list;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/overscroll_behavior_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/overscroll_behavior_custom.cc
deleted file mode 100644
index 92e2ceaa..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/overscroll_behavior_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/overscroll_behavior.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool OverscrollBehavior::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      overscrollBehaviorShorthand(), important, context, range, properties);
-}
-
-const CSSValue* OverscrollBehavior::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorX()));
-  list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorY()));
-  return list;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/padding_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/padding_block_custom.cc
deleted file mode 100644
index 580b8a0..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/padding_block_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/padding_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PaddingBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      paddingBlockShorthand(), important, context, range, properties);
-}
-
-const CSSValue* PaddingBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      paddingBlockShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/padding_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/padding_custom.cc
deleted file mode 100644
index c4442989..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/padding_custom.cc
+++ /dev/null
@@ -1,46 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/padding.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/layout/layout_object.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool Padding::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      paddingShorthand(), important, context, range, properties);
-}
-
-bool Padding::IsLayoutDependent(const ComputedStyle* style,
-                                LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox() &&
-         (!style || !style->PaddingBottom().IsFixed() ||
-          !style->PaddingTop().IsFixed() || !style->PaddingLeft().IsFixed() ||
-          !style->PaddingRight().IsFixed());
-}
-
-const CSSValue* Padding::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(paddingShorthand(), style,
-                                                     layout_object, styled_node,
-                                                     allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/padding_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/padding_inline_custom.cc
deleted file mode 100644
index b60986b88..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/padding_inline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/padding_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PaddingInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      paddingInlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* PaddingInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      paddingInlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/page_break_after_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/page_break_after_custom.cc
deleted file mode 100644
index ae67470..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/page_break_after_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_after.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PageBreakAfter::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
-    return false;
-  }
-
-  DCHECK(IsValidCSSValueID(value));
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakAfter, CSSPropertyID::kPageBreakAfter,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* PageBreakAfter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakAfter());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/page_break_before_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/page_break_before_custom.cc
deleted file mode 100644
index 42a4c2b..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/page_break_before_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_before.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PageBreakBefore::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
-    return false;
-  }
-
-  DCHECK(IsValidCSSValueID(value));
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakBefore, CSSPropertyID::kPageBreakBefore,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* PageBreakBefore::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakBefore());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/page_break_inside_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/page_break_inside_custom.cc
deleted file mode 100644
index b5872d1..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/page_break_inside_custom.cc
+++ /dev/null
@@ -1,44 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_inside.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PageBreakInside::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakInside, CSSPropertyID::kPageBreakInside,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* PageBreakInside::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForPageBreakInside(style.BreakInside());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/place_content_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/place_content_custom.cc
deleted file mode 100644
index 18bff370..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/place_content_custom.cc
+++ /dev/null
@@ -1,72 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/place_content.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/properties/longhand.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PlaceContent::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceContent).length(), 2u);
-
-  CSSParserTokenRange range_copy = range;
-  const CSSValue* align_content_value =
-      To<Longhand>(GetCSSPropertyAlignContent())
-          .ParseSingleValue(range, context, local_context);
-  if (!align_content_value)
-    return false;
-
-  if (range.AtEnd())
-    range = range_copy;
-
-  const CSSValue* justify_content_value =
-      To<Longhand>(GetCSSPropertyJustifyContent())
-          .ParseSingleValue(range, context, local_context);
-  if (!justify_content_value || !range.AtEnd())
-    return false;
-
-  DCHECK(align_content_value);
-  DCHECK(justify_content_value);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kAlignContent, CSSPropertyID::kPlaceContent,
-      *align_content_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kJustifyContent, CSSPropertyID::kPlaceContent,
-      *justify_content_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* PlaceContent::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  // TODO (jfernandez): The spec states that we should return the specified
-  // value.
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      placeContentShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/place_items_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/place_items_custom.cc
deleted file mode 100644
index fd0f92c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/place_items_custom.cc
+++ /dev/null
@@ -1,72 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/place_items.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/properties/longhand.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PlaceItems::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceItems).length(), 2u);
-
-  CSSParserTokenRange range_copy = range;
-  const CSSValue* align_items_value =
-      To<Longhand>(GetCSSPropertyAlignItems())
-          .ParseSingleValue(range, context, local_context);
-  if (!align_items_value)
-    return false;
-
-  if (range.AtEnd())
-    range = range_copy;
-
-  const CSSValue* justify_items_value =
-      To<Longhand>(GetCSSPropertyJustifyItems())
-          .ParseSingleValue(range, context, local_context);
-  if (!justify_items_value || !range.AtEnd())
-    return false;
-
-  DCHECK(align_items_value);
-  DCHECK(justify_items_value);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kAlignItems, CSSPropertyID::kPlaceItems,
-      *align_items_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kJustifyItems, CSSPropertyID::kPlaceItems,
-      *justify_items_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* PlaceItems::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  // TODO (jfernandez): The spec states that we should return the specified
-  // value.
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      placeItemsShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/place_self_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/place_self_custom.cc
deleted file mode 100644
index c5658779..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/place_self_custom.cc
+++ /dev/null
@@ -1,71 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/place_self.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/css/properties/longhand.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool PlaceSelf::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceSelf).length(), 2u);
-
-  CSSParserTokenRange range_copy = range;
-  const CSSValue* align_self_value =
-      To<Longhand>(GetCSSPropertyAlignSelf())
-          .ParseSingleValue(range, context, local_context);
-  if (!align_self_value)
-    return false;
-
-  if (range.AtEnd())
-    range = range_copy;
-
-  const CSSValue* justify_self_value =
-      To<Longhand>(GetCSSPropertyJustifySelf())
-          .ParseSingleValue(range, context, local_context);
-  if (!justify_self_value || !range.AtEnd())
-    return false;
-
-  DCHECK(align_self_value);
-  DCHECK(justify_self_value);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kAlignSelf, CSSPropertyID::kPlaceSelf, *align_self_value,
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kJustifySelf, CSSPropertyID::kPlaceSelf,
-      *justify_self_value, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* PlaceSelf::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  // TODO (jfernandez): The spec states that we should return the specified
-  // value.
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      placeSelfShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_block_custom.cc
deleted file mode 100644
index 9b2f504..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_block_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollMarginBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      scrollMarginBlockShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollMarginBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      scrollMarginBlockShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_custom.cc
deleted file mode 100644
index 3cf8b9c..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollMargin::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      scrollMarginShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollMargin::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      scrollMarginShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_inline_custom.cc
deleted file mode 100644
index 1c8b2b7..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_inline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollMarginInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      scrollMarginInlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollMarginInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      scrollMarginInlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_block_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_block_custom.cc
deleted file mode 100644
index f3c70674..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_block_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_block.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollPaddingBlock::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      scrollPaddingBlockShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollPaddingBlock::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      scrollPaddingBlockShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_custom.cc
deleted file mode 100644
index 2075592e..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollPadding::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
-      scrollPaddingShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollPadding::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForSidesShorthand(
-      scrollPaddingShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_inline_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_inline_custom.cc
deleted file mode 100644
index 414a582..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_inline_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_inline.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool ScrollPaddingInline::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
-      scrollPaddingInlineShorthand(), important, context, range, properties);
-}
-
-const CSSValue* ScrollPaddingInline::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
-      scrollPaddingInlineShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
new file mode 100644
index 0000000..17af7a1e
--- /dev/null
+++ b/third_party/blink/renderer/core/css/properties/shorthands/shorthands_custom.cc
@@ -0,0 +1,3238 @@
+// 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 "base/stl_util.h"
+#include "third_party/blink/renderer/core/css/css_font_family_value.h"
+#include "third_party/blink/renderer/core/css/css_identifier_value.h"
+#include "third_party/blink/renderer/core/css/css_initial_value.h"
+#include "third_party/blink/renderer/core/css/css_primitive_value_mappings.h"
+#include "third_party/blink/renderer/core/css/css_property_value.h"
+#include "third_party/blink/renderer/core/css/css_value_pair.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_fast_paths.h"
+#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
+#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_east_asian_parser.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_ligatures_parser.h"
+#include "third_party/blink/renderer/core/css/parser/font_variant_numeric_parser.h"
+#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
+#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
+#include "third_party/blink/renderer/core/css/properties/longhand.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/animation.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/background.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/background_position.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/background_repeat.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_color.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_end.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_start.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_style.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_block_width.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_bottom.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_color.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_image.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_color.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_end.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_start.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_style.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_inline_width.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_left.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_radius.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_right.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_spacing.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_style.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_top.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/border_width.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/column_rule.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/columns.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/flex.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/flex_flow.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/font.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/font_variant.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/gap.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_area.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_column.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_column_gap.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_gap.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_row.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_row_gap.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/grid_template.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/inset.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/inset_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/inset_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/list_style.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/margin.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/margin_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/margin_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/marker.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/offset.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/outline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/overflow.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/overscroll_behavior.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/padding.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/padding_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/padding_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_after.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_before.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/page_break_inside.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/place_content.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/place_items.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/place_self.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_margin_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_block.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/scroll_padding_inline.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/text_decoration.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/transition.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_after.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_before.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_inside.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_margin_collapse.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_box_image.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_position.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_repeat.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_text_emphasis.h"
+#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_text_stroke.h"
+#include "third_party/blink/renderer/core/css/zoom_adjusted_pixel_value.h"
+#include "third_party/blink/renderer/core/layout/layout_object.h"
+#include "third_party/blink/renderer/core/layout/layout_theme.h"
+#include "third_party/blink/renderer/core/style/computed_style.h"
+#include "third_party/blink/renderer/core/style_property_shorthand.h"
+#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
+
+// Implementations of methods in Shorthand subclasses that aren't generated.
+
+namespace blink {
+namespace css_shorthand {
+
+namespace {
+
+// Legacy parsing allows <string>s for animation-name.
+CSSValue* ConsumeAnimationValue(CSSPropertyID property,
+                                CSSParserTokenRange& range,
+                                const CSSParserContext& context,
+                                bool use_legacy_parsing) {
+  switch (property) {
+    case CSSPropertyID::kAnimationDelay:
+      return css_property_parser_helpers::ConsumeTime(range, kValueRangeAll);
+    case CSSPropertyID::kAnimationDirection:
+      return css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kNormal, CSSValueID::kAlternate, CSSValueID::kReverse,
+          CSSValueID::kAlternateReverse>(range);
+    case CSSPropertyID::kAnimationDuration:
+      return css_property_parser_helpers::ConsumeTime(range,
+                                                      kValueRangeNonNegative);
+    case CSSPropertyID::kAnimationFillMode:
+      return css_property_parser_helpers::ConsumeIdent<
+          CSSValueID::kNone, CSSValueID::kForwards, CSSValueID::kBackwards,
+          CSSValueID::kBoth>(range);
+    case CSSPropertyID::kAnimationIterationCount:
+      return css_parsing_utils::ConsumeAnimationIterationCount(range);
+    case CSSPropertyID::kAnimationName:
+      return css_parsing_utils::ConsumeAnimationName(range, context,
+                                                     use_legacy_parsing);
+    case CSSPropertyID::kAnimationPlayState:
+      return css_property_parser_helpers::ConsumeIdent<CSSValueID::kRunning,
+                                                       CSSValueID::kPaused>(
+          range);
+    case CSSPropertyID::kAnimationTimingFunction:
+      return css_parsing_utils::ConsumeAnimationTimingFunction(range);
+    default:
+      NOTREACHED();
+      return nullptr;
+  }
+}
+
+}  // namespace
+
+bool Animation::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const StylePropertyShorthand shorthand = animationShorthandForParsing();
+  const unsigned longhand_count = shorthand.length();
+
+  HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
+      longhands(longhand_count);
+  if (!css_parsing_utils::ConsumeAnimationShorthand(
+          shorthand, longhands, ConsumeAnimationValue, range, context,
+          local_context.UseAliasParsing())) {
+    return false;
+  }
+
+  for (unsigned i = 0; i < longhand_count; ++i) {
+    css_property_parser_helpers::AddProperty(
+        shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+  return range.AtEnd();
+}
+
+const CSSValue* Animation::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const CSSAnimationData* animation_data = style.Animations();
+  if (animation_data) {
+    CSSValueList* animations_list = CSSValueList::CreateCommaSeparated();
+    for (wtf_size_t i = 0; i < animation_data->NameList().size(); ++i) {
+      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+      list->Append(*CSSPrimitiveValue::Create(
+          CSSTimingData::GetRepeated(animation_data->DurationList(), i),
+          CSSPrimitiveValue::UnitType::kSeconds));
+      list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
+          CSSTimingData::GetRepeated(animation_data->TimingFunctionList(), i)
+              .get()));
+      list->Append(*CSSPrimitiveValue::Create(
+          CSSTimingData::GetRepeated(animation_data->DelayList(), i),
+          CSSPrimitiveValue::UnitType::kSeconds));
+      list->Append(*ComputedStyleUtils::ValueForAnimationIterationCount(
+          CSSTimingData::GetRepeated(animation_data->IterationCountList(), i)));
+      list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
+          CSSTimingData::GetRepeated(animation_data->DirectionList(), i)));
+      list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
+          CSSTimingData::GetRepeated(animation_data->FillModeList(), i)));
+      list->Append(*ComputedStyleUtils::ValueForAnimationPlayState(
+          CSSTimingData::GetRepeated(animation_data->PlayStateList(), i)));
+      list->Append(*MakeGarbageCollected<CSSCustomIdentValue>(
+          animation_data->NameList()[i]));
+      animations_list->Append(*list);
+    }
+    return animations_list;
+  }
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  // animation-name default value.
+  list->Append(*CSSIdentifierValue::Create(CSSValueID::kNone));
+  list->Append(
+      *CSSPrimitiveValue::Create(CSSAnimationData::InitialDuration(),
+                                 CSSPrimitiveValue::UnitType::kSeconds));
+  list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
+      CSSAnimationData::InitialTimingFunction().get()));
+  list->Append(*CSSPrimitiveValue::Create(
+      CSSAnimationData::InitialDelay(), CSSPrimitiveValue::UnitType::kSeconds));
+  list->Append(
+      *CSSPrimitiveValue::Create(CSSAnimationData::InitialIterationCount(),
+                                 CSSPrimitiveValue::UnitType::kNumber));
+  list->Append(*ComputedStyleUtils::ValueForAnimationDirection(
+      CSSAnimationData::InitialDirection()));
+  list->Append(*ComputedStyleUtils::ValueForAnimationFillMode(
+      CSSAnimationData::InitialFillMode()));
+  // Initial animation-play-state.
+  list->Append(*CSSIdentifierValue::Create(CSSValueID::kRunning));
+  return list;
+}
+
+bool Background::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
+                                                  local_context, properties);
+}
+
+const CSSValue* Background::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForBackgroundShorthand(
+      style, layout_object, styled_node, allow_visited_style);
+}
+
+bool BackgroundPosition::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* result_x = nullptr;
+  CSSValue* result_y = nullptr;
+
+  if (!css_parsing_utils::ConsumeBackgroundPosition(
+          range, context, css_property_parser_helpers::UnitlessQuirk::kAllow,
+          result_x, result_y) ||
+      !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBackgroundPositionX, CSSPropertyID::kBackgroundPosition,
+      *result_x, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBackgroundPositionY, CSSPropertyID::kBackgroundPosition,
+      *result_y, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* BackgroundPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
+      *this, style, &style.BackgroundLayers());
+}
+
+bool BackgroundRepeat::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* result_x = nullptr;
+  CSSValue* result_y = nullptr;
+  bool implicit = false;
+  if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
+                                             implicit) ||
+      !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBackgroundRepeatX, CSSPropertyID::kBackgroundRepeat,
+      *result_x, important,
+      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
+               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBackgroundRepeatY, CSSPropertyID::kBackgroundRepeat,
+      *result_y, important,
+      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
+               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* BackgroundRepeat::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
+      &style.BackgroundLayers());
+}
+
+bool BorderBlockColor::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderBlockColorShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderBlockColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderBlockColorShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const CSSValue* width = nullptr;
+  const CSSValue* style = nullptr;
+  const CSSValue* color = nullptr;
+
+  if (!css_property_parser_helpers::ConsumeBorderShorthand(
+          range, context, width, style, color)) {
+    return false;
+  };
+
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderBlockWidth, *width, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderBlockStyle, *style, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderBlockColor, *color, important, properties);
+
+  return range.AtEnd();
+}
+
+const CSSValue* BorderBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const CSSValue* value_start =
+      GetCSSPropertyBorderBlockStart().CSSValueFromComputedStyle(
+          style, layout_object, styled_node, allow_visited_style);
+  const CSSValue* value_end =
+      GetCSSPropertyBorderBlockEnd().CSSValueFromComputedStyle(
+          style, layout_object, styled_node, allow_visited_style);
+  if (!DataEquivalent(value_start, value_end)) {
+    return nullptr;
+  }
+  return value_start;
+}
+
+bool BorderBlockEnd::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderBlockEndShorthand(), important, context, range, properties);
+}
+
+bool BorderBlockStart::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderBlockStartShorthand(), important, context, range, properties);
+}
+
+bool BorderBlockStyle::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderBlockStyleShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderBlockStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderBlockStyleShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderBlockWidth::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderBlockWidthShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderBlockWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderBlockWidthShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderBottom::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderBottomShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderBottom::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      borderBottomShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderColor::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      borderColorShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      borderColorShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Border::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const CSSValue* width = nullptr;
+  const CSSValue* style = nullptr;
+  const CSSValue* color = nullptr;
+
+  if (!css_property_parser_helpers::ConsumeBorderShorthand(
+          range, context, width, style, color)) {
+    return false;
+  };
+
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderWidth, *width, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderStyle, *style, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderColor, *color, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderImage, *CSSInitialValue::Create(), important,
+      properties);
+
+  return range.AtEnd();
+}
+
+const CSSValue* Border::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const CSSValue* value = GetCSSPropertyBorderTop().CSSValueFromComputedStyle(
+      style, layout_object, styled_node, allow_visited_style);
+  static const CSSProperty* kProperties[3] = {&GetCSSPropertyBorderRight(),
+                                              &GetCSSPropertyBorderBottom(),
+                                              &GetCSSPropertyBorderLeft()};
+  for (size_t i = 0; i < base::size(kProperties); ++i) {
+    const CSSValue* value_for_side = kProperties[i]->CSSValueFromComputedStyle(
+        style, layout_object, styled_node, allow_visited_style);
+    if (!DataEquivalent(value, value_for_side)) {
+      return nullptr;
+    }
+  }
+  return value;
+}
+
+bool BorderImage::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* source = nullptr;
+  CSSValue* slice = nullptr;
+  CSSValue* width = nullptr;
+  CSSValue* outset = nullptr;
+  CSSValue* repeat = nullptr;
+
+  if (!css_parsing_utils::ConsumeBorderImageComponents(
+          range, context, source, slice, width, outset, repeat,
+          css_parsing_utils::DefaultFill::kNoFill)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderImageSource, CSSPropertyID::kBorderImage,
+      source
+          ? *source
+          : *To<Longhand>(&GetCSSPropertyBorderImageSource())->InitialValue(),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderImageSlice, CSSPropertyID::kBorderImage,
+      slice ? *slice
+            : *To<Longhand>(&GetCSSPropertyBorderImageSlice())->InitialValue(),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderImageWidth, CSSPropertyID::kBorderImage,
+      width ? *width
+            : *To<Longhand>(&GetCSSPropertyBorderImageWidth())->InitialValue(),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderImageOutset, CSSPropertyID::kBorderImage,
+      outset
+          ? *outset
+          : *To<Longhand>(&GetCSSPropertyBorderImageOutset())->InitialValue(),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderImageRepeat, CSSPropertyID::kBorderImage,
+      repeat
+          ? *repeat
+          : *To<Longhand>(&GetCSSPropertyBorderImageRepeat())->InitialValue(),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* BorderImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImage(style.BorderImage(), style);
+}
+
+bool BorderInlineColor::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderInlineColorShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderInlineColor::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderInlineColorShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const CSSValue* width = nullptr;
+  const CSSValue* style = nullptr;
+  const CSSValue* color = nullptr;
+
+  if (!css_property_parser_helpers::ConsumeBorderShorthand(
+          range, context, width, style, color)) {
+    return false;
+  };
+
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderInlineWidth, *width, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderInlineStyle, *style, important, properties);
+  css_property_parser_helpers::AddExpandedPropertyForValue(
+      CSSPropertyID::kBorderInlineColor, *color, important, properties);
+
+  return range.AtEnd();
+}
+
+const CSSValue* BorderInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const CSSValue* value_start =
+      GetCSSPropertyBorderInlineStart().CSSValueFromComputedStyle(
+          style, layout_object, styled_node, allow_visited_style);
+  const CSSValue* value_end =
+      GetCSSPropertyBorderInlineEnd().CSSValueFromComputedStyle(
+          style, layout_object, styled_node, allow_visited_style);
+  if (!DataEquivalent(value_start, value_end)) {
+    return nullptr;
+  }
+  return value_start;
+}
+
+bool BorderInlineEnd::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderInlineEndShorthand(), important, context, range, properties);
+}
+
+bool BorderInlineStart::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderInlineStartShorthand(), important, context, range, properties);
+}
+
+bool BorderInlineStyle::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderInlineStyleShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderInlineStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderInlineStyleShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderInlineWidth::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      borderInlineWidthShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderInlineWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      borderInlineWidthShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderLeft::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderLeftShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderLeft::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      borderLeftShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderRadius::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* horizontal_radii[4] = {nullptr};
+  CSSValue* vertical_radii[4] = {nullptr};
+
+  if (!css_parsing_utils::ConsumeRadii(horizontal_radii, vertical_radii, range,
+                                       context.Mode(),
+                                       local_context.UseAliasParsing()))
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderTopLeftRadius, CSSPropertyID::kBorderRadius,
+      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[0],
+                                          vertical_radii[0],
+                                          CSSValuePair::kDropIdenticalValues),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderTopRightRadius, CSSPropertyID::kBorderRadius,
+      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[1],
+                                          vertical_radii[1],
+                                          CSSValuePair::kDropIdenticalValues),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderBottomRightRadius, CSSPropertyID::kBorderRadius,
+      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[2],
+                                          vertical_radii[2],
+                                          CSSValuePair::kDropIdenticalValues),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBorderBottomLeftRadius, CSSPropertyID::kBorderRadius,
+      *MakeGarbageCollected<CSSValuePair>(horizontal_radii[3],
+                                          vertical_radii[3],
+                                          CSSValuePair::kDropIdenticalValues),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* BorderRadius::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForBorderRadiusShorthand(style);
+}
+
+bool BorderRight::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderRightShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderRight::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      borderRightShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderSpacing::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* horizontal_spacing =
+      ConsumeLength(range, context.Mode(), kValueRangeNonNegative,
+                    css_property_parser_helpers::UnitlessQuirk::kAllow);
+  if (!horizontal_spacing)
+    return false;
+  CSSValue* vertical_spacing = horizontal_spacing;
+  if (!range.AtEnd()) {
+    vertical_spacing =
+        ConsumeLength(range, context.Mode(), kValueRangeNonNegative,
+                      css_property_parser_helpers::UnitlessQuirk::kAllow);
+  }
+  if (!vertical_spacing || !range.AtEnd())
+    return false;
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitBorderHorizontalSpacing,
+      CSSPropertyID::kBorderSpacing, *horizontal_spacing, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitBorderVerticalSpacing,
+      CSSPropertyID::kBorderSpacing, *vertical_spacing, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* BorderSpacing::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*ZoomAdjustedPixelValue(style.HorizontalBorderSpacing(), style));
+  list->Append(*ZoomAdjustedPixelValue(style.VerticalBorderSpacing(), style));
+  return list;
+}
+
+bool BorderStyle::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      borderStyleShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      borderStyleShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderTop::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      borderTopShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderTop::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      borderTopShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool BorderWidth::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      borderWidthShorthand(), important, context, range, properties);
+}
+
+const CSSValue* BorderWidth::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      borderWidthShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ColumnRule::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      columnRuleShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ColumnRule::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      columnRuleShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Columns::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* column_width = nullptr;
+  CSSValue* column_count = nullptr;
+  if (!css_parsing_utils::ConsumeColumnWidthOrCount(range, column_width,
+                                                    column_count))
+    return false;
+  css_parsing_utils::ConsumeColumnWidthOrCount(range, column_width,
+                                               column_count);
+  if (!range.AtEnd())
+    return false;
+  if (!column_width)
+    column_width = CSSIdentifierValue::Create(CSSValueID::kAuto);
+  if (!column_count)
+    column_count = CSSIdentifierValue::Create(CSSValueID::kAuto);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kColumnWidth, CSSPropertyID::kInvalid, *column_width,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kColumnCount, CSSPropertyID::kInvalid, *column_count,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* Columns::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      columnsShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Flex::ParseShorthand(bool important,
+                          CSSParserTokenRange& range,
+                          const CSSParserContext& context,
+                          const CSSParserLocalContext&,
+                          HeapVector<CSSPropertyValue, 256>& properties) const {
+  static const double kUnsetValue = -1;
+  double flex_grow = kUnsetValue;
+  double flex_shrink = kUnsetValue;
+  CSSValue* flex_basis = nullptr;
+
+  if (range.Peek().Id() == CSSValueID::kNone) {
+    flex_grow = 0;
+    flex_shrink = 0;
+    flex_basis = CSSIdentifierValue::Create(CSSValueID::kAuto);
+    range.ConsumeIncludingWhitespace();
+  } else {
+    unsigned index = 0;
+    while (!range.AtEnd() && index++ < 3) {
+      double num;
+      if (css_property_parser_helpers::ConsumeNumberRaw(range, num)) {
+        if (num < 0)
+          return false;
+        if (flex_grow == kUnsetValue) {
+          flex_grow = num;
+        } else if (flex_shrink == kUnsetValue) {
+          flex_shrink = num;
+        } else if (!num) {
+          // flex only allows a basis of 0 (sans units) if
+          // flex-grow and flex-shrink values have already been
+          // set.
+          flex_basis = CSSPrimitiveValue::Create(
+              0, CSSPrimitiveValue::UnitType::kPixels);
+        } else {
+          return false;
+        }
+      } else if (!flex_basis) {
+        if (range.Peek().Id() == CSSValueID::kAuto)
+          flex_basis = css_property_parser_helpers::ConsumeIdent(range);
+        if (!flex_basis) {
+          flex_basis = css_property_parser_helpers::ConsumeLengthOrPercent(
+              range, context.Mode(), kValueRangeNonNegative);
+        }
+        if (index == 2 && !range.AtEnd())
+          return false;
+      }
+    }
+    if (index == 0)
+      return false;
+    if (flex_grow == kUnsetValue)
+      flex_grow = 1;
+    if (flex_shrink == kUnsetValue)
+      flex_shrink = 1;
+    if (!flex_basis) {
+      flex_basis = CSSPrimitiveValue::Create(
+          0, CSSPrimitiveValue::UnitType::kPercentage);
+    }
+  }
+
+  if (!range.AtEnd())
+    return false;
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFlexGrow, CSSPropertyID::kFlex,
+      *CSSPrimitiveValue::Create(clampTo<float>(flex_grow),
+                                 CSSPrimitiveValue::UnitType::kNumber),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFlexShrink, CSSPropertyID::kFlex,
+      *CSSPrimitiveValue::Create(clampTo<float>(flex_shrink),
+                                 CSSPrimitiveValue::UnitType::kNumber),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFlexBasis, CSSPropertyID::kFlex, *flex_basis, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* Flex::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      flexShorthand(), style, layout_object, styled_node, allow_visited_style);
+}
+
+bool FlexFlow::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      flexFlowShorthand(), important, context, range, properties);
+}
+
+const CSSValue* FlexFlow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      flexFlowShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+namespace {
+
+bool ConsumeSystemFont(bool important,
+                       CSSParserTokenRange& range,
+                       HeapVector<CSSPropertyValue, 256>& properties) {
+  CSSValueID system_font_id = range.ConsumeIncludingWhitespace().Id();
+  DCHECK_GE(system_font_id, CSSValueID::kCaption);
+  DCHECK_LE(system_font_id, CSSValueID::kStatusBar);
+  if (!range.AtEnd())
+    return false;
+
+  FontSelectionValue font_style = NormalSlopeValue();
+  FontSelectionValue font_weight = NormalWeightValue();
+  float font_size = 0;
+  AtomicString font_family;
+  LayoutTheme::GetTheme().SystemFont(system_font_id, font_style, font_weight,
+                                     font_size, font_family);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(font_style == ItalicSlopeValue()
+                                      ? CSSValueID::kItalic
+                                      : CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
+      *CSSPrimitiveValue::Create(font_weight,
+                                 CSSPrimitiveValue::UnitType::kNumber),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontSize, CSSPropertyID::kFont,
+      *CSSPrimitiveValue::Create(font_size,
+                                 CSSPrimitiveValue::UnitType::kPixels),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  CSSValueList* font_family_list = CSSValueList::CreateCommaSeparated();
+  font_family_list->Append(*CSSFontFamilyValue::Create(font_family));
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *font_family_list,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+bool ConsumeFont(bool important,
+                 CSSParserTokenRange& range,
+                 const CSSParserContext& context,
+                 HeapVector<CSSPropertyValue, 256>& properties) {
+  // Optional font-style, font-variant, font-stretch and font-weight.
+  CSSValue* font_style = nullptr;
+  CSSIdentifierValue* font_variant_caps = nullptr;
+  CSSValue* font_weight = nullptr;
+  CSSValue* font_stretch = nullptr;
+  while (!range.AtEnd()) {
+    CSSValueID id = range.Peek().Id();
+    if (!font_style &&
+        (id == CSSValueID::kNormal || id == CSSValueID::kItalic ||
+         id == CSSValueID::kOblique)) {
+      font_style = css_parsing_utils::ConsumeFontStyle(range, context.Mode());
+      if (!font_style)
+        return false;
+      continue;
+    }
+    if (!font_variant_caps &&
+        (id == CSSValueID::kNormal || id == CSSValueID::kSmallCaps)) {
+      // Font variant in the shorthand is particular, it only accepts normal or
+      // small-caps.
+      // See https://drafts.csswg.org/css-fonts/#propdef-font
+      font_variant_caps = css_parsing_utils::ConsumeFontVariantCSS21(range);
+      if (font_variant_caps)
+        continue;
+    }
+    if (!font_weight) {
+      font_weight = css_parsing_utils::ConsumeFontWeight(range, context.Mode());
+      if (font_weight)
+        continue;
+    }
+    // Stretch in the font shorthand can only take the CSS Fonts Level 3
+    // keywords, not arbitrary values, compare
+    // https://drafts.csswg.org/css-fonts-4/#font-prop
+    // Bail out if the last possible property of the set in this loop could not
+    // be parsed, this closes the first block of optional values of the font
+    // shorthand, compare: [ [ <‘font-style’> || <font-variant-css21> ||
+    // <‘font-weight’> || <font-stretch-css3> ]?
+    if (font_stretch ||
+        !(font_stretch =
+              css_parsing_utils::ConsumeFontStretchKeywordOnly(range)))
+      break;
+  }
+
+  if (range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontStyle, CSSPropertyID::kFont,
+      font_style ? *font_style
+                 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFont,
+      font_variant_caps ? *font_variant_caps
+                        : *CSSIdentifierValue::Create(CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFont,
+      *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontWeight, CSSPropertyID::kFont,
+      font_weight ? *font_weight
+                  : *CSSIdentifierValue::Create(CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontStretch, CSSPropertyID::kFont,
+      font_stretch ? *font_stretch
+                   : *CSSIdentifierValue::Create(CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  // Now a font size _must_ come.
+  CSSValue* font_size =
+      css_parsing_utils::ConsumeFontSize(range, context.Mode());
+  if (!font_size || range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontSize, CSSPropertyID::kFont, *font_size, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+    CSSValue* line_height =
+        css_parsing_utils::ConsumeLineHeight(range, context.Mode());
+    if (!line_height)
+      return false;
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kLineHeight, CSSPropertyID::kFont, *line_height,
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kLineHeight, CSSPropertyID::kFont,
+        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  // Font family must come now.
+  CSSValue* parsed_family_value = css_parsing_utils::ConsumeFontFamily(range);
+  if (!parsed_family_value)
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontFamily, CSSPropertyID::kFont, *parsed_family_value,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  // FIXME: http://www.w3.org/TR/2011/WD-css3-fonts-20110324/#font-prop requires
+  // that "font-stretch", "font-size-adjust", and "font-kerning" be reset to
+  // their initial values but we don't seem to support them at the moment. They
+  // should also be added here once implemented.
+  return range.AtEnd();
+}
+
+}  // namespace
+
+bool Font::ParseShorthand(bool important,
+                          CSSParserTokenRange& range,
+                          const CSSParserContext& context,
+                          const CSSParserLocalContext&,
+                          HeapVector<CSSPropertyValue, 256>& properties) const {
+  const CSSParserToken& token = range.Peek();
+  if (token.Id() >= CSSValueID::kCaption &&
+      token.Id() <= CSSValueID::kStatusBar)
+    return ConsumeSystemFont(important, range, properties);
+  return ConsumeFont(important, range, context, properties);
+}
+
+const CSSValue* Font::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForFont(style);
+}
+
+bool FontVariant::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  if (css_property_parser_helpers::IdentMatches<CSSValueID::kNormal,
+                                                CSSValueID::kNone>(
+          range.Peek().Id())) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
+        *css_property_parser_helpers::ConsumeIdent(range), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
+        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
+        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
+        *CSSIdentifierValue::Create(CSSValueID::kNormal), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    return range.AtEnd();
+  }
+
+  CSSIdentifierValue* caps_value = nullptr;
+  FontVariantLigaturesParser ligatures_parser;
+  FontVariantNumericParser numeric_parser;
+  FontVariantEastAsianParser east_asian_parser;
+  do {
+    FontVariantLigaturesParser::ParseResult ligatures_parse_result =
+        ligatures_parser.ConsumeLigature(range);
+    FontVariantNumericParser::ParseResult numeric_parse_result =
+        numeric_parser.ConsumeNumeric(range);
+    FontVariantEastAsianParser::ParseResult east_asian_parse_result =
+        east_asian_parser.ConsumeEastAsian(range);
+    if (ligatures_parse_result ==
+            FontVariantLigaturesParser::ParseResult::kConsumedValue ||
+        numeric_parse_result ==
+            FontVariantNumericParser::ParseResult::kConsumedValue ||
+        east_asian_parse_result ==
+            FontVariantEastAsianParser::ParseResult::kConsumedValue)
+      continue;
+
+    if (ligatures_parse_result ==
+            FontVariantLigaturesParser::ParseResult::kDisallowedValue ||
+        numeric_parse_result ==
+            FontVariantNumericParser::ParseResult::kDisallowedValue ||
+        east_asian_parse_result ==
+            FontVariantEastAsianParser::ParseResult::kDisallowedValue)
+      return false;
+
+    CSSValueID id = range.Peek().Id();
+    switch (id) {
+      case CSSValueID::kSmallCaps:
+      case CSSValueID::kAllSmallCaps:
+      case CSSValueID::kPetiteCaps:
+      case CSSValueID::kAllPetiteCaps:
+      case CSSValueID::kUnicase:
+      case CSSValueID::kTitlingCaps:
+        // Only one caps value permitted in font-variant grammar.
+        if (caps_value)
+          return false;
+        caps_value = css_property_parser_helpers::ConsumeIdent(range);
+        break;
+      default:
+        return false;
+    }
+  } while (!range.AtEnd());
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantLigatures, CSSPropertyID::kFontVariant,
+      *ligatures_parser.FinalizeValue(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantNumeric, CSSPropertyID::kFontVariant,
+      *numeric_parser.FinalizeValue(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantEastAsian, CSSPropertyID::kFontVariant,
+      *east_asian_parser.FinalizeValue(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kFontVariantCaps, CSSPropertyID::kFontVariant,
+      caps_value ? *caps_value
+                 : *CSSIdentifierValue::Create(CSSValueID::kNormal),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* FontVariant::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForFontVariantProperty(
+      style, layout_object, styled_node, allow_visited_style);
+}
+
+bool Gap::ParseShorthand(bool important,
+                         CSSParserTokenRange& range,
+                         const CSSParserContext& context,
+                         const CSSParserLocalContext&,
+                         HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGap).length(), 2u);
+  CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
+  CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
+  if (!row_gap || !range.AtEnd())
+    return false;
+  if (!column_gap)
+    column_gap = row_gap;
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* Gap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      gapShorthand(), style, layout_object, styled_node, allow_visited_style);
+}
+
+bool GridArea::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(gridAreaShorthand().length(), 4u);
+
+  CSSValue* row_start_value =
+      css_parsing_utils::ConsumeGridLine(range, context);
+  if (!row_start_value)
+    return false;
+  CSSValue* column_start_value = nullptr;
+  CSSValue* row_end_value = nullptr;
+  CSSValue* column_end_value = nullptr;
+  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+    column_start_value = css_parsing_utils::ConsumeGridLine(range, context);
+    if (!column_start_value)
+      return false;
+    if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+      row_end_value = css_parsing_utils::ConsumeGridLine(range, context);
+      if (!row_end_value)
+        return false;
+      if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+        column_end_value = css_parsing_utils::ConsumeGridLine(range, context);
+        if (!column_end_value)
+          return false;
+      }
+    }
+  }
+  if (!range.AtEnd())
+    return false;
+  if (!column_start_value) {
+    column_start_value = row_start_value->IsCustomIdentValue()
+                             ? row_start_value
+                             : CSSIdentifierValue::Create(CSSValueID::kAuto);
+  }
+  if (!row_end_value) {
+    row_end_value = row_start_value->IsCustomIdentValue()
+                        ? row_start_value
+                        : CSSIdentifierValue::Create(CSSValueID::kAuto);
+  }
+  if (!column_end_value) {
+    column_end_value = column_start_value->IsCustomIdentValue()
+                           ? column_start_value
+                           : CSSIdentifierValue::Create(CSSValueID::kAuto);
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridRowStart, CSSPropertyID::kGridArea, *row_start_value,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridColumnStart, CSSPropertyID::kGridArea,
+      *column_start_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridRowEnd, CSSPropertyID::kGridArea, *row_end_value,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridColumnEnd, CSSPropertyID::kGridArea,
+      *column_end_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* GridArea::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForGridShorthand(gridAreaShorthand(), style,
+                                                    layout_object, styled_node,
+                                                    allow_visited_style);
+}
+
+bool GridColumn::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const StylePropertyShorthand& shorthand =
+      shorthandForProperty(CSSPropertyID::kGridColumn);
+  DCHECK_EQ(shorthand.length(), 2u);
+
+  CSSValue* start_value = nullptr;
+  CSSValue* end_value = nullptr;
+  if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
+          important, range, context, start_value, end_value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridColumn,
+      *start_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridColumn,
+      *end_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* GridColumn::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForGridShorthand(
+      gridColumnShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool GridColumnGap::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
+  if (!gap_length || !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kColumnGap, CSSPropertyID::kGridColumnGap, *gap_length,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* GridColumnGap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      gridColumnGapShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+namespace {
+
+CSSValueList* ConsumeImplicitAutoFlow(CSSParserTokenRange& range,
+                                      const CSSValue& flow_direction) {
+  // [ auto-flow && dense? ]
+  CSSValue* dense_algorithm = nullptr;
+  if ((css_property_parser_helpers::ConsumeIdent<CSSValueID::kAutoFlow>(
+          range))) {
+    dense_algorithm =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
+  } else {
+    dense_algorithm =
+        css_property_parser_helpers::ConsumeIdent<CSSValueID::kDense>(range);
+    if (!dense_algorithm)
+      return nullptr;
+    if (!css_property_parser_helpers::ConsumeIdent<CSSValueID::kAutoFlow>(
+            range))
+      return nullptr;
+  }
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(flow_direction);
+  if (dense_algorithm)
+    list->Append(*dense_algorithm);
+  return list;
+}
+
+}  // namespace
+
+bool Grid::ParseShorthand(bool important,
+                          CSSParserTokenRange& range,
+                          const CSSParserContext& context,
+                          const CSSParserLocalContext&,
+                          HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGrid).length(), 6u);
+
+  CSSParserTokenRange range_copy = range;
+
+  CSSValue* template_rows = nullptr;
+  CSSValue* template_columns = nullptr;
+  CSSValue* template_areas = nullptr;
+
+  if (css_parsing_utils::ConsumeGridTemplateShorthand(
+          important, range, context, template_rows, template_columns,
+          template_areas)) {
+    DCHECK(template_rows);
+    DCHECK(template_columns);
+    DCHECK(template_areas);
+
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
+        *template_columns, important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
+        *template_areas, important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+
+    // It can only be specified the explicit or the implicit grid properties in
+    // a single grid declaration. The sub-properties not specified are set to
+    // their initial value, as normal for shorthands.
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    return true;
+  }
+
+  range = range_copy;
+
+  CSSValue* auto_columns_value = nullptr;
+  CSSValue* auto_rows_value = nullptr;
+  CSSValueList* grid_auto_flow = nullptr;
+  template_rows = nullptr;
+  template_columns = nullptr;
+
+  if (css_property_parser_helpers::IdentMatches<CSSValueID::kDense,
+                                                CSSValueID::kAutoFlow>(
+          range.Peek().Id())) {
+    // 2- [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns>
+    grid_auto_flow = ConsumeImplicitAutoFlow(
+        range, *CSSIdentifierValue::Create(CSSValueID::kRow));
+    if (!grid_auto_flow)
+      return false;
+    if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+      auto_rows_value = CSSInitialValue::Create();
+    } else {
+      auto_rows_value = css_parsing_utils::ConsumeGridTrackList(
+          range, context, context.Mode(),
+          css_parsing_utils::TrackListType::kGridAuto);
+      if (!auto_rows_value)
+        return false;
+      if (!css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range))
+        return false;
+    }
+    if (!(template_columns =
+              css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(
+                  range, context, context.Mode())))
+      return false;
+    template_rows = CSSInitialValue::Create();
+    auto_columns_value = CSSInitialValue::Create();
+  } else {
+    // 3- <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>?
+    template_rows = css_parsing_utils::ConsumeGridTemplatesRowsOrColumns(
+        range, context, context.Mode());
+    if (!template_rows)
+      return false;
+    if (!css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range))
+      return false;
+    grid_auto_flow = ConsumeImplicitAutoFlow(
+        range, *CSSIdentifierValue::Create(CSSValueID::kColumn));
+    if (!grid_auto_flow)
+      return false;
+    if (range.AtEnd()) {
+      auto_columns_value = CSSInitialValue::Create();
+    } else {
+      auto_columns_value = css_parsing_utils::ConsumeGridTrackList(
+          range, context, context.Mode(),
+          css_parsing_utils::TrackListType::kGridAuto);
+      if (!auto_columns_value)
+        return false;
+    }
+    template_columns = CSSInitialValue::Create();
+    auto_rows_value = CSSInitialValue::Create();
+  }
+
+  if (!range.AtEnd())
+    return false;
+
+  // It can only be specified the explicit or the implicit grid properties in a
+  // single grid declaration. The sub-properties not specified are set to their
+  // initial value, as normal for shorthands.
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGrid,
+      *template_columns, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGrid, *template_rows,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGrid,
+      *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridAutoFlow, CSSPropertyID::kGrid, *grid_auto_flow,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridAutoColumns, CSSPropertyID::kGrid,
+      *auto_columns_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridAutoRows, CSSPropertyID::kGrid, *auto_rows_value,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+bool Grid::IsLayoutDependent(const ComputedStyle* style,
+                             LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsLayoutGrid();
+}
+
+const CSSValue* Grid::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForGridShorthand(
+      gridShorthand(), style, layout_object, styled_node, allow_visited_style);
+}
+
+bool GridGap::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kGridGap).length(), 2u);
+  CSSValue* row_gap = css_parsing_utils::ConsumeGapLength(range, context);
+  CSSValue* column_gap = css_parsing_utils::ConsumeGapLength(range, context);
+  if (!row_gap || !range.AtEnd())
+    return false;
+  if (!column_gap)
+    column_gap = row_gap;
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kRowGap, CSSPropertyID::kGap, *row_gap, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kColumnGap, CSSPropertyID::kGap, *column_gap, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* GridGap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      gridGapShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool GridRow::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const StylePropertyShorthand& shorthand =
+      shorthandForProperty(CSSPropertyID::kGridRow);
+  DCHECK_EQ(shorthand.length(), 2u);
+
+  CSSValue* start_value = nullptr;
+  CSSValue* end_value = nullptr;
+  if (!css_parsing_utils::ConsumeGridItemPositionShorthand(
+          important, range, context, start_value, end_value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      shorthand.properties()[0]->PropertyID(), CSSPropertyID::kGridRow,
+      *start_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      shorthand.properties()[1]->PropertyID(), CSSPropertyID::kGridRow,
+      *end_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* GridRow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForGridShorthand(gridRowShorthand(), style,
+                                                    layout_object, styled_node,
+                                                    allow_visited_style);
+}
+
+bool GridRowGap::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* gap_length = css_parsing_utils::ConsumeGapLength(range, context);
+  if (!gap_length || !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kRowGap, CSSPropertyID::kGridRowGap, *gap_length,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* GridRowGap::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      gridRowGapShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool GridTemplate::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* template_rows = nullptr;
+  CSSValue* template_columns = nullptr;
+  CSSValue* template_areas = nullptr;
+  if (!css_parsing_utils::ConsumeGridTemplateShorthand(
+          important, range, context, template_rows, template_columns,
+          template_areas))
+    return false;
+
+  DCHECK(template_rows);
+  DCHECK(template_columns);
+  DCHECK(template_areas);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateRows, CSSPropertyID::kGridTemplate,
+      *template_rows, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateColumns, CSSPropertyID::kGridTemplate,
+      *template_columns, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kGridTemplateAreas, CSSPropertyID::kGridTemplate,
+      *template_areas, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+bool GridTemplate::IsLayoutDependent(const ComputedStyle* style,
+                                     LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsLayoutGrid();
+}
+
+const CSSValue* GridTemplate::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForGridShorthand(
+      gridTemplateShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool InsetBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      insetBlockShorthand(), important, context, range, properties);
+}
+
+const CSSValue* InsetBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      insetBlockShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Inset::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      insetShorthand(), important, context, range, properties);
+}
+
+const CSSValue* Inset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      insetShorthand(), style, layout_object, styled_node, allow_visited_style);
+}
+
+bool InsetInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      insetInlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* InsetInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      insetInlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ListStyle::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      listStyleShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ListStyle::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      listStyleShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool MarginBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      marginBlockShorthand(), important, context, range, properties);
+}
+
+const CSSValue* MarginBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      marginBlockShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Margin::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      marginShorthand(), important, context, range, properties);
+}
+
+bool Margin::IsLayoutDependent(const ComputedStyle* style,
+                               LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->MarginBottom().IsFixed() ||
+          !style->MarginTop().IsFixed() || !style->MarginLeft().IsFixed() ||
+          !style->MarginRight().IsFixed());
+}
+
+const CSSValue* Margin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(marginShorthand(), style,
+                                                     layout_object, styled_node,
+                                                     allow_visited_style);
+}
+
+bool MarginInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      marginInlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* MarginInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      marginInlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Marker::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const CSSValue* marker = css_property_parser_helpers::ParseLonghand(
+      CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, context, range);
+  if (!marker || !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kMarkerStart, CSSPropertyID::kMarker, *marker, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kMarkerMid, CSSPropertyID::kMarker, *marker, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kMarkerEnd, CSSPropertyID::kMarker, *marker, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+bool Offset::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  // TODO(meade): The propertyID parameter isn't used - it can be removed
+  // once all of the ParseSingleValue implementations have been moved to the
+  // CSSPropertys, and the base CSSProperty::ParseSingleValue contains
+  // no functionality.
+  const CSSValue* offset_position =
+      To<Longhand>(GetCSSPropertyOffsetPosition())
+          .ParseSingleValue(range, context, CSSParserLocalContext());
+  const CSSValue* offset_path =
+      css_parsing_utils::ConsumeOffsetPath(range, context);
+  const CSSValue* offset_distance = nullptr;
+  const CSSValue* offset_rotate = nullptr;
+  if (offset_path) {
+    offset_distance = css_property_parser_helpers::ConsumeLengthOrPercent(
+        range, context.Mode(), kValueRangeAll);
+    offset_rotate = css_parsing_utils::ConsumeOffsetRotate(range, context);
+    if (offset_rotate && !offset_distance) {
+      offset_distance = css_property_parser_helpers::ConsumeLengthOrPercent(
+          range, context.Mode(), kValueRangeAll);
+    }
+  }
+  const CSSValue* offset_anchor = nullptr;
+  if (css_property_parser_helpers::ConsumeSlashIncludingWhitespace(range)) {
+    offset_anchor =
+        To<Longhand>(GetCSSPropertyOffsetAnchor())
+            .ParseSingleValue(range, context, CSSParserLocalContext());
+    if (!offset_anchor)
+      return false;
+  }
+  if ((!offset_position && !offset_path) || !range.AtEnd())
+    return false;
+
+  if ((offset_position || offset_anchor) &&
+      !RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled())
+    return false;
+
+  if (offset_position) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
+        *offset_position, important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetPosition, CSSPropertyID::kOffset,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  if (offset_path) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset, *offset_path,
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetPath, CSSPropertyID::kOffset,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  if (offset_distance) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
+        *offset_distance, important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetDistance, CSSPropertyID::kOffset,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  if (offset_rotate) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset, *offset_rotate,
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetRotate, CSSPropertyID::kOffset,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  if (offset_anchor) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset, *offset_anchor,
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  } else if (RuntimeEnabledFeatures::CSSOffsetPositionAnchorEnabled()) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kOffsetAnchor, CSSPropertyID::kOffset,
+        *CSSInitialValue::Create(), important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  return true;
+}
+
+const CSSValue* Offset::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForOffset(style, layout_object, styled_node,
+                                            allow_visited_style);
+}
+
+bool Outline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      outlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* Outline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      outlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Overflow::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      overflowShorthand(), important, context, range, properties);
+}
+
+const CSSValue* Overflow::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*CSSIdentifierValue::Create(style.OverflowX()));
+  if (style.OverflowX() != style.OverflowY())
+    list->Append(*CSSIdentifierValue::Create(style.OverflowY()));
+
+  return list;
+}
+
+bool OverscrollBehavior::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      overscrollBehaviorShorthand(), important, context, range, properties);
+}
+
+const CSSValue* OverscrollBehavior::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorX()));
+  list->Append(*CSSIdentifierValue::Create(style.OverscrollBehaviorY()));
+  return list;
+}
+
+bool PaddingBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      paddingBlockShorthand(), important, context, range, properties);
+}
+
+const CSSValue* PaddingBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      paddingBlockShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool Padding::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      paddingShorthand(), important, context, range, properties);
+}
+
+bool Padding::IsLayoutDependent(const ComputedStyle* style,
+                                LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox() &&
+         (!style || !style->PaddingBottom().IsFixed() ||
+          !style->PaddingTop().IsFixed() || !style->PaddingLeft().IsFixed() ||
+          !style->PaddingRight().IsFixed());
+}
+
+const CSSValue* Padding::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(paddingShorthand(), style,
+                                                     layout_object, styled_node,
+                                                     allow_visited_style);
+}
+
+bool PaddingInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      paddingInlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* PaddingInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      paddingInlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool PageBreakAfter::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
+    return false;
+  }
+
+  DCHECK(IsValidCSSValueID(value));
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakAfter, CSSPropertyID::kPageBreakAfter,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* PageBreakAfter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakAfter());
+}
+
+bool PageBreakBefore::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromPageBreakBetween(range, value)) {
+    return false;
+  }
+
+  DCHECK(IsValidCSSValueID(value));
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakBefore, CSSPropertyID::kPageBreakBefore,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* PageBreakBefore::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPageBreakBetween(style.BreakBefore());
+}
+
+bool PageBreakInside::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakInside, CSSPropertyID::kPageBreakInside,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* PageBreakInside::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForPageBreakInside(style.BreakInside());
+}
+
+bool PlaceContent::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceContent).length(), 2u);
+
+  CSSParserTokenRange range_copy = range;
+  const CSSValue* align_content_value =
+      To<Longhand>(GetCSSPropertyAlignContent())
+          .ParseSingleValue(range, context, local_context);
+  if (!align_content_value)
+    return false;
+
+  if (range.AtEnd())
+    range = range_copy;
+
+  const CSSValue* justify_content_value =
+      To<Longhand>(GetCSSPropertyJustifyContent())
+          .ParseSingleValue(range, context, local_context);
+  if (!justify_content_value || !range.AtEnd())
+    return false;
+
+  DCHECK(align_content_value);
+  DCHECK(justify_content_value);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kAlignContent, CSSPropertyID::kPlaceContent,
+      *align_content_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kJustifyContent, CSSPropertyID::kPlaceContent,
+      *justify_content_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* PlaceContent::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  // TODO (jfernandez): The spec states that we should return the specified
+  // value.
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      placeContentShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool PlaceItems::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceItems).length(), 2u);
+
+  CSSParserTokenRange range_copy = range;
+  const CSSValue* align_items_value =
+      To<Longhand>(GetCSSPropertyAlignItems())
+          .ParseSingleValue(range, context, local_context);
+  if (!align_items_value)
+    return false;
+
+  if (range.AtEnd())
+    range = range_copy;
+
+  const CSSValue* justify_items_value =
+      To<Longhand>(GetCSSPropertyJustifyItems())
+          .ParseSingleValue(range, context, local_context);
+  if (!justify_items_value || !range.AtEnd())
+    return false;
+
+  DCHECK(align_items_value);
+  DCHECK(justify_items_value);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kAlignItems, CSSPropertyID::kPlaceItems,
+      *align_items_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kJustifyItems, CSSPropertyID::kPlaceItems,
+      *justify_items_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* PlaceItems::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  // TODO (jfernandez): The spec states that we should return the specified
+  // value.
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      placeItemsShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool PlaceSelf::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  DCHECK_EQ(shorthandForProperty(CSSPropertyID::kPlaceSelf).length(), 2u);
+
+  CSSParserTokenRange range_copy = range;
+  const CSSValue* align_self_value =
+      To<Longhand>(GetCSSPropertyAlignSelf())
+          .ParseSingleValue(range, context, local_context);
+  if (!align_self_value)
+    return false;
+
+  if (range.AtEnd())
+    range = range_copy;
+
+  const CSSValue* justify_self_value =
+      To<Longhand>(GetCSSPropertyJustifySelf())
+          .ParseSingleValue(range, context, local_context);
+  if (!justify_self_value || !range.AtEnd())
+    return false;
+
+  DCHECK(align_self_value);
+  DCHECK(justify_self_value);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kAlignSelf, CSSPropertyID::kPlaceSelf, *align_self_value,
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kJustifySelf, CSSPropertyID::kPlaceSelf,
+      *justify_self_value, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* PlaceSelf::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  // TODO (jfernandez): The spec states that we should return the specified
+  // value.
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      placeSelfShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollMarginBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      scrollMarginBlockShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollMarginBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      scrollMarginBlockShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollMargin::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      scrollMarginShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollMargin::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      scrollMarginShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollMarginInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      scrollMarginInlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollMarginInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      scrollMarginInlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollPaddingBlock::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      scrollPaddingBlockShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollPaddingBlock::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      scrollPaddingBlockShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollPadding::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia4Longhands(
+      scrollPaddingShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollPadding::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForSidesShorthand(
+      scrollPaddingShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool ScrollPaddingInline::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandVia2Longhands(
+      scrollPaddingInlineShorthand(), important, context, range, properties);
+}
+
+const CSSValue* ScrollPaddingInline::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForInlineBlockShorthand(
+      scrollPaddingInlineShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+bool TextDecoration::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      textDecorationShorthand(), important, context, range, properties);
+}
+
+const CSSValue* TextDecoration::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject* layout_object,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValuesForShorthandProperty(
+      textDecorationShorthand(), style, layout_object, styled_node,
+      allow_visited_style);
+}
+
+namespace {
+
+CSSValue* ConsumeTransitionValue(CSSPropertyID property,
+                                 CSSParserTokenRange& range,
+                                 const CSSParserContext& context,
+                                 bool use_legacy_parsing) {
+  switch (property) {
+    case CSSPropertyID::kTransitionDelay:
+      return css_property_parser_helpers::ConsumeTime(range, kValueRangeAll);
+    case CSSPropertyID::kTransitionDuration:
+      return css_property_parser_helpers::ConsumeTime(range,
+                                                      kValueRangeNonNegative);
+    case CSSPropertyID::kTransitionProperty:
+      return css_parsing_utils::ConsumeTransitionProperty(range, context);
+    case CSSPropertyID::kTransitionTimingFunction:
+      return css_parsing_utils::ConsumeAnimationTimingFunction(range);
+    default:
+      NOTREACHED();
+      return nullptr;
+  }
+}
+
+}  // namespace
+
+bool Transition::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  const StylePropertyShorthand shorthand = transitionShorthandForParsing();
+  const unsigned longhand_count = shorthand.length();
+
+  HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
+      longhands(longhand_count);
+  if (!css_parsing_utils::ConsumeAnimationShorthand(
+          shorthand, longhands, ConsumeTransitionValue, range, context,
+          local_context.UseAliasParsing())) {
+    return false;
+  }
+
+  for (unsigned i = 0; i < longhand_count; ++i) {
+    if (shorthand.properties()[i]->IDEquals(
+            CSSPropertyID::kTransitionProperty) &&
+        !css_parsing_utils::IsValidPropertyList(*longhands[i]))
+      return false;
+  }
+
+  for (unsigned i = 0; i < longhand_count; ++i) {
+    css_property_parser_helpers::AddProperty(
+        shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
+        important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+
+  return range.AtEnd();
+}
+
+const CSSValue* Transition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  const CSSTransitionData* transition_data = style.Transitions();
+  if (transition_data) {
+    CSSValueList* transitions_list = CSSValueList::CreateCommaSeparated();
+    for (wtf_size_t i = 0; i < transition_data->PropertyList().size(); ++i) {
+      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+      list->Append(*ComputedStyleUtils::CreateTransitionPropertyValue(
+          transition_data->PropertyList()[i]));
+      list->Append(*CSSPrimitiveValue::Create(
+          CSSTimingData::GetRepeated(transition_data->DurationList(), i),
+          CSSPrimitiveValue::UnitType::kSeconds));
+      list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
+          CSSTimingData::GetRepeated(transition_data->TimingFunctionList(), i)
+              .get()));
+      list->Append(*CSSPrimitiveValue::Create(
+          CSSTimingData::GetRepeated(transition_data->DelayList(), i),
+          CSSPrimitiveValue::UnitType::kSeconds));
+      transitions_list->Append(*list);
+    }
+    return transitions_list;
+  }
+
+  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
+  // transition-property default value.
+  list->Append(*CSSIdentifierValue::Create(CSSValueID::kAll));
+  list->Append(
+      *CSSPrimitiveValue::Create(CSSTransitionData::InitialDuration(),
+                                 CSSPrimitiveValue::UnitType::kSeconds));
+  list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
+      CSSTransitionData::InitialTimingFunction().get()));
+  list->Append(
+      *CSSPrimitiveValue::Create(CSSTransitionData::InitialDelay(),
+                                 CSSPrimitiveValue::UnitType::kSeconds));
+  return list;
+}
+
+bool WebkitColumnBreakAfter::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakAfter, CSSPropertyID::kWebkitColumnBreakAfter,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* WebkitColumnBreakAfter::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
+      style.BreakAfter());
+}
+
+bool WebkitColumnBreakBefore::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakBefore, CSSPropertyID::kWebkitColumnBreakBefore,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* WebkitColumnBreakBefore::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
+      style.BreakBefore());
+}
+
+bool WebkitColumnBreakInside::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID value;
+  if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kBreakInside, CSSPropertyID::kWebkitColumnBreakInside,
+      *CSSIdentifierValue::Create(value), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* WebkitColumnBreakInside::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node* styled_node,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForWebkitColumnBreakInside(
+      style.BreakInside());
+}
+
+bool WebkitMarginCollapse::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValueID id = range.ConsumeIncludingWhitespace().Id();
+  if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
+          CSSPropertyID::kWebkitMarginBeforeCollapse, id, context.Mode()))
+    return false;
+
+  CSSValue* before_collapse = CSSIdentifierValue::Create(id);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMarginBeforeCollapse,
+      CSSPropertyID::kWebkitMarginCollapse, *before_collapse, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  if (range.AtEnd()) {
+    css_property_parser_helpers::AddProperty(
+        CSSPropertyID::kWebkitMarginAfterCollapse,
+        CSSPropertyID::kWebkitMarginCollapse, *before_collapse, important,
+        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+        properties);
+    return true;
+  }
+
+  id = range.ConsumeIncludingWhitespace().Id();
+  if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
+          CSSPropertyID::kWebkitMarginAfterCollapse, id, context.Mode()))
+    return false;
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMarginAfterCollapse,
+      CSSPropertyID::kWebkitMarginCollapse, *CSSIdentifierValue::Create(id),
+      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+bool WebkitMaskBoxImage::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* source = nullptr;
+  CSSValue* slice = nullptr;
+  CSSValue* width = nullptr;
+  CSSValue* outset = nullptr;
+  CSSValue* repeat = nullptr;
+
+  if (!css_parsing_utils::ConsumeBorderImageComponents(
+          range, context, source, slice, width, outset, repeat,
+          css_parsing_utils::DefaultFill::kFill)) {
+    return false;
+  }
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskBoxImageSource,
+      CSSPropertyID::kWebkitMaskBoxImage,
+      source ? *source : *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskBoxImageSlice,
+      CSSPropertyID::kWebkitMaskBoxImage,
+      slice ? *slice : *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskBoxImageWidth,
+      CSSPropertyID::kWebkitMaskBoxImage,
+      width ? *width : *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskBoxImageOutset,
+      CSSPropertyID::kWebkitMaskBoxImage,
+      outset ? *outset : *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskBoxImageRepeat,
+      CSSPropertyID::kWebkitMaskBoxImage,
+      repeat ? *repeat : *CSSInitialValue::Create(), important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* WebkitMaskBoxImage::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::ValueForNinePieceImage(style.MaskBoxImage(),
+                                                    style);
+}
+
+bool WebkitMask::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
+                                                  local_context, properties);
+}
+
+bool WebkitMaskPosition::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* result_x = nullptr;
+  CSSValue* result_y = nullptr;
+
+  if (!css_parsing_utils::ConsumeBackgroundPosition(
+          range, context, css_property_parser_helpers::UnitlessQuirk::kAllow,
+          result_x, result_y) ||
+      !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskPositionX, CSSPropertyID::kWebkitMaskPosition,
+      *result_x, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskPositionY, CSSPropertyID::kWebkitMaskPosition,
+      *result_y, important,
+      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  return true;
+}
+
+const CSSValue* WebkitMaskPosition::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
+      *this, style, &style.MaskLayers());
+}
+
+bool WebkitMaskRepeat::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  CSSValue* result_x = nullptr;
+  CSSValue* result_y = nullptr;
+  bool implicit = false;
+  if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
+                                             implicit) ||
+      !range.AtEnd())
+    return false;
+
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskRepeatX, CSSPropertyID::kWebkitMaskRepeat,
+      *result_x, important,
+      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
+               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+  css_property_parser_helpers::AddProperty(
+      CSSPropertyID::kWebkitMaskRepeatY, CSSPropertyID::kWebkitMaskRepeat,
+      *result_y, important,
+      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
+               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
+      properties);
+
+  return true;
+}
+
+const CSSValue* WebkitMaskRepeat::CSSValueFromComputedStyleInternal(
+    const ComputedStyle& style,
+    const SVGComputedStyle&,
+    const LayoutObject*,
+    Node*,
+    bool allow_visited_style) const {
+  return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
+      &style.MaskLayers());
+}
+
+bool WebkitTextEmphasis::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      webkitTextEmphasisShorthand(), important, context, range, properties);
+}
+
+bool WebkitTextStroke::ParseShorthand(
+    bool important,
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&,
+    HeapVector<CSSPropertyValue, 256>& properties) const {
+  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
+      webkitTextStrokeShorthand(), important, context, range, properties);
+}
+
+}  // namespace css_shorthand
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/text_decoration_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/text_decoration_custom.cc
deleted file mode 100644
index 9aefde62..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/text_decoration_custom.cc
+++ /dev/null
@@ -1,37 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/text_decoration.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool TextDecoration::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      textDecorationShorthand(), important, context, range, properties);
-}
-
-const CSSValue* TextDecoration::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject* layout_object,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValuesForShorthandProperty(
-      textDecorationShorthand(), style, layout_object, styled_node,
-      allow_visited_style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/transition_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/transition_custom.cc
deleted file mode 100644
index 1238dd0..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/transition_custom.cc
+++ /dev/null
@@ -1,119 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/transition.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_local_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace {
-
-CSSValue* ConsumeTransitionValue(CSSPropertyID property,
-                                 CSSParserTokenRange& range,
-                                 const CSSParserContext& context,
-                                 bool use_legacy_parsing) {
-  switch (property) {
-    case CSSPropertyID::kTransitionDelay:
-      return css_property_parser_helpers::ConsumeTime(range, kValueRangeAll);
-    case CSSPropertyID::kTransitionDuration:
-      return css_property_parser_helpers::ConsumeTime(range,
-                                                      kValueRangeNonNegative);
-    case CSSPropertyID::kTransitionProperty:
-      return css_parsing_utils::ConsumeTransitionProperty(range, context);
-    case CSSPropertyID::kTransitionTimingFunction:
-      return css_parsing_utils::ConsumeAnimationTimingFunction(range);
-    default:
-      NOTREACHED();
-      return nullptr;
-  }
-}
-
-}  // namespace
-namespace css_shorthand {
-
-bool Transition::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  const StylePropertyShorthand shorthand = transitionShorthandForParsing();
-  const unsigned longhand_count = shorthand.length();
-
-  HeapVector<Member<CSSValueList>, css_parsing_utils::kMaxNumAnimationLonghands>
-      longhands(longhand_count);
-  if (!css_parsing_utils::ConsumeAnimationShorthand(
-          shorthand, longhands, ConsumeTransitionValue, range, context,
-          local_context.UseAliasParsing())) {
-    return false;
-  }
-
-  for (unsigned i = 0; i < longhand_count; ++i) {
-    if (shorthand.properties()[i]->IDEquals(
-            CSSPropertyID::kTransitionProperty) &&
-        !css_parsing_utils::IsValidPropertyList(*longhands[i]))
-      return false;
-  }
-
-  for (unsigned i = 0; i < longhand_count; ++i) {
-    css_property_parser_helpers::AddProperty(
-        shorthand.properties()[i]->PropertyID(), shorthand.id(), *longhands[i],
-        important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-
-  return range.AtEnd();
-}
-
-const CSSValue* Transition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  const CSSTransitionData* transition_data = style.Transitions();
-  if (transition_data) {
-    CSSValueList* transitions_list = CSSValueList::CreateCommaSeparated();
-    for (wtf_size_t i = 0; i < transition_data->PropertyList().size(); ++i) {
-      CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-      list->Append(*ComputedStyleUtils::CreateTransitionPropertyValue(
-          transition_data->PropertyList()[i]));
-      list->Append(*CSSPrimitiveValue::Create(
-          CSSTimingData::GetRepeated(transition_data->DurationList(), i),
-          CSSPrimitiveValue::UnitType::kSeconds));
-      list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
-          CSSTimingData::GetRepeated(transition_data->TimingFunctionList(), i)
-              .get()));
-      list->Append(*CSSPrimitiveValue::Create(
-          CSSTimingData::GetRepeated(transition_data->DelayList(), i),
-          CSSPrimitiveValue::UnitType::kSeconds));
-      transitions_list->Append(*list);
-    }
-    return transitions_list;
-  }
-
-  CSSValueList* list = CSSValueList::CreateSpaceSeparated();
-  // transition-property default value.
-  list->Append(*CSSIdentifierValue::Create(CSSValueID::kAll));
-  list->Append(
-      *CSSPrimitiveValue::Create(CSSTransitionData::InitialDuration(),
-                                 CSSPrimitiveValue::UnitType::kSeconds));
-  list->Append(*ComputedStyleUtils::CreateTimingFunctionValue(
-      CSSTransitionData::InitialTimingFunction().get()));
-  list->Append(
-      *CSSPrimitiveValue::Create(CSSTransitionData::InitialDelay(),
-                                 CSSPrimitiveValue::UnitType::kSeconds));
-  return list;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_after_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_after_custom.cc
deleted file mode 100644
index 09ef9b3..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_after_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_after.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitColumnBreakAfter::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakAfter, CSSPropertyID::kWebkitColumnBreakAfter,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* WebkitColumnBreakAfter::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
-      style.BreakAfter());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_before_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_before_custom.cc
deleted file mode 100644
index 555a97e3..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_before_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_before.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitColumnBreakBefore::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromColumnBreakBetween(range, value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakBefore, CSSPropertyID::kWebkitColumnBreakBefore,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* WebkitColumnBreakBefore::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForWebkitColumnBreakBetween(
-      style.BreakBefore());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_inside_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_inside_custom.cc
deleted file mode 100644
index 0b768c8..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_inside_custom.cc
+++ /dev/null
@@ -1,45 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_column_break_inside.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitColumnBreakInside::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID value;
-  if (!css_parsing_utils::ConsumeFromColumnOrPageBreakInside(range, value)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kBreakInside, CSSPropertyID::kWebkitColumnBreakInside,
-      *CSSIdentifierValue::Create(value), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* WebkitColumnBreakInside::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node* styled_node,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForWebkitColumnBreakInside(
-      style.BreakInside());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_margin_collapse_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_margin_collapse_custom.cc
deleted file mode 100644
index 1f2517a..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_margin_collapse_custom.cc
+++ /dev/null
@@ -1,55 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_margin_collapse.h"
-
-#include "third_party/blink/renderer/core/css/css_identifier_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_fast_paths.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitMarginCollapse::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValueID id = range.ConsumeIncludingWhitespace().Id();
-  if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
-          CSSPropertyID::kWebkitMarginBeforeCollapse, id, context.Mode()))
-    return false;
-
-  CSSValue* before_collapse = CSSIdentifierValue::Create(id);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMarginBeforeCollapse,
-      CSSPropertyID::kWebkitMarginCollapse, *before_collapse, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  if (range.AtEnd()) {
-    css_property_parser_helpers::AddProperty(
-        CSSPropertyID::kWebkitMarginAfterCollapse,
-        CSSPropertyID::kWebkitMarginCollapse, *before_collapse, important,
-        css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-        properties);
-    return true;
-  }
-
-  id = range.ConsumeIncludingWhitespace().Id();
-  if (!CSSParserFastPaths::IsValidKeywordPropertyAndValue(
-          CSSPropertyID::kWebkitMarginAfterCollapse, id, context.Mode()))
-    return false;
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMarginAfterCollapse,
-      CSSPropertyID::kWebkitMarginCollapse, *CSSIdentifierValue::Create(id),
-      important, css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_box_image_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_box_image_custom.cc
deleted file mode 100644
index 65f1141b..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_box_image_custom.cc
+++ /dev/null
@@ -1,80 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_box_image.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitMaskBoxImage::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* source = nullptr;
-  CSSValue* slice = nullptr;
-  CSSValue* width = nullptr;
-  CSSValue* outset = nullptr;
-  CSSValue* repeat = nullptr;
-
-  if (!css_parsing_utils::ConsumeBorderImageComponents(
-          range, context, source, slice, width, outset, repeat,
-          css_parsing_utils::DefaultFill::kFill)) {
-    return false;
-  }
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskBoxImageSource,
-      CSSPropertyID::kWebkitMaskBoxImage,
-      source ? *source : *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskBoxImageSlice,
-      CSSPropertyID::kWebkitMaskBoxImage,
-      slice ? *slice : *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskBoxImageWidth,
-      CSSPropertyID::kWebkitMaskBoxImage,
-      width ? *width : *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskBoxImageOutset,
-      CSSPropertyID::kWebkitMaskBoxImage,
-      outset ? *outset : *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskBoxImageRepeat,
-      CSSPropertyID::kWebkitMaskBoxImage,
-      repeat ? *repeat : *CSSInitialValue::Create(), important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* WebkitMaskBoxImage::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::ValueForNinePieceImage(style.MaskBoxImage(),
-                                                    style);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_custom.cc
deleted file mode 100644
index 5656c807..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_custom.cc
+++ /dev/null
@@ -1,23 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask.h"
-
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitMask::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_parsing_utils::ParseBackgroundOrMask(important, range, context,
-                                                  local_context, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_position_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_position_custom.cc
deleted file mode 100644
index b16fc37..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_position_custom.cc
+++ /dev/null
@@ -1,56 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_position.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitMaskPosition::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* result_x = nullptr;
-  CSSValue* result_y = nullptr;
-
-  if (!css_parsing_utils::ConsumeBackgroundPosition(
-          range, context, css_property_parser_helpers::UnitlessQuirk::kAllow,
-          result_x, result_y) ||
-      !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskPositionX, CSSPropertyID::kWebkitMaskPosition,
-      *result_x, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskPositionY, CSSPropertyID::kWebkitMaskPosition,
-      *result_y, important,
-      css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  return true;
-}
-
-const CSSValue* WebkitMaskPosition::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::BackgroundPositionOrWebkitMaskPosition(
-      *this, style, &style.MaskLayers());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_repeat_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_repeat_custom.cc
deleted file mode 100644
index 3f4c3c8..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_repeat_custom.cc
+++ /dev/null
@@ -1,59 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_mask_repeat.h"
-
-#include "third_party/blink/renderer/core/css/css_initial_value.h"
-#include "third_party/blink/renderer/core/css/parser/css_parser_context.h"
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/css/properties/computed_style_utils.h"
-#include "third_party/blink/renderer/core/css/properties/css_parsing_utils.h"
-#include "third_party/blink/renderer/core/style/computed_style.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitMaskRepeat::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  CSSValue* result_x = nullptr;
-  CSSValue* result_y = nullptr;
-  bool implicit = false;
-  if (!css_parsing_utils::ConsumeRepeatStyle(range, result_x, result_y,
-                                             implicit) ||
-      !range.AtEnd())
-    return false;
-
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskRepeatX, CSSPropertyID::kWebkitMaskRepeat,
-      *result_x, important,
-      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
-               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-  css_property_parser_helpers::AddProperty(
-      CSSPropertyID::kWebkitMaskRepeatY, CSSPropertyID::kWebkitMaskRepeat,
-      *result_y, important,
-      implicit ? css_property_parser_helpers::IsImplicitProperty::kImplicit
-               : css_property_parser_helpers::IsImplicitProperty::kNotImplicit,
-      properties);
-
-  return true;
-}
-
-const CSSValue* WebkitMaskRepeat::CSSValueFromComputedStyleInternal(
-    const ComputedStyle& style,
-    const SVGComputedStyle&,
-    const LayoutObject*,
-    Node*,
-    bool allow_visited_style) const {
-  return ComputedStyleUtils::BackgroundRepeatOrWebkitMaskRepeat(
-      &style.MaskLayers());
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_emphasis_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_emphasis_custom.cc
deleted file mode 100644
index ad53227..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_emphasis_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_text_emphasis.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitTextEmphasis::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      webkitTextEmphasisShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_stroke_custom.cc b/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_stroke_custom.cc
deleted file mode 100644
index 3ed0b96..0000000
--- a/third_party/blink/renderer/core/css/properties/shorthands/webkit_text_stroke_custom.cc
+++ /dev/null
@@ -1,24 +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.
-
-#include "third_party/blink/renderer/core/css/properties/shorthands/webkit_text_stroke.h"
-
-#include "third_party/blink/renderer/core/css/parser/css_property_parser_helpers.h"
-#include "third_party/blink/renderer/core/style_property_shorthand.h"
-
-namespace blink {
-namespace css_shorthand {
-
-bool WebkitTextStroke::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return css_property_parser_helpers::ConsumeShorthandGreedilyViaLonghands(
-      webkitTextStrokeShorthand(), important, context, range, properties);
-}
-
-}  // namespace css_shorthand
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/css/resolver/css_variable_resolver.cc b/third_party/blink/renderer/core/css/resolver/css_variable_resolver.cc
index 78ebb25..7059cfcb 100644
--- a/third_party/blink/renderer/core/css/resolver/css_variable_resolver.cc
+++ b/third_party/blink/renderer/core/css/resolver/css_variable_resolver.cc
@@ -28,57 +28,11 @@
 #include "third_party/blink/renderer/core/style/style_inherited_variables.h"
 #include "third_party/blink/renderer/core/style/style_non_inherited_variables.h"
 #include "third_party/blink/renderer/core/style_property_shorthand.h"
-#include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 namespace blink {
 
-namespace {
-
-CSSParserToken ResolveUrl(const CSSParserToken& token,
-                          Vector<String>& backing_strings,
-                          const String& base_url,
-                          WTF::TextEncoding charset) {
-  DCHECK(token.GetType() == kUrlToken || token.GetType() == kStringToken);
-
-  StringView string_view = token.Value();
-
-  if (string_view.IsNull())
-    return token;
-
-  String relative_url = string_view.ToString();
-  KURL base = !base_url.IsNull() ? KURL(base_url) : KURL();
-  KURL absolute_url = charset.IsValid() ? KURL(base, relative_url, charset)
-                                        : KURL(base, relative_url);
-
-  backing_strings.push_back(absolute_url.GetString());
-
-  return token.CopyWithUpdatedString(StringView(backing_strings.back()));
-}
-
-// Rewrites (in-place) kUrlTokens and kFunctionToken/CSSValueUrls to contain
-// absolute URLs.
-void ResolveRelativeUrls(Vector<CSSParserToken>& tokens,
-                         Vector<String>& backing_strings,
-                         const String& base_url,
-                         const WTF::TextEncoding& charset) {
-  CSSParserToken* token = tokens.begin();
-  CSSParserToken* end = tokens.end();
-
-  while (token < end) {
-    if (token->GetType() == kUrlToken) {
-      *token = ResolveUrl(*token, backing_strings, base_url, charset);
-    } else if (token->FunctionId() == CSSValueID::kUrl) {
-      if (token + 1 < end && token[1].GetType() == kStringToken)
-        token[1] = ResolveUrl(token[1], backing_strings, base_url, charset);
-    }
-    ++token;
-  }
-}
-
-}  // namespace
-
 CSSVariableResolver::Fallback CSSVariableResolver::ResolveFallback(
     CSSParserTokenRange range,
     const Options& options,
@@ -187,7 +141,8 @@
   // sequences are called "absolutized".
   if (resolved_value && !resolved_data->IsAbsolutized()) {
     resolved_value = &StyleBuilderConverter::ConvertRegisteredPropertyValue(
-        state_, *resolved_value);
+        state_, *resolved_value, resolved_data->BaseURL(),
+        resolved_data->Charset());
     resolved_data =
         StyleBuilderConverter::ConvertRegisteredPropertyVariableData(
             *resolved_value, resolved_data->IsAnimationTainted());
@@ -218,9 +173,8 @@
     AtomicString name,
     const CSSVariableData& variable_data,
     const Options& options,
-    bool resolve_urls,
     bool& cycle_detected) {
-  DCHECK(variable_data.NeedsVariableResolution() || resolve_urls);
+  DCHECK(variable_data.NeedsVariableResolution());
 
   Result result;
   result.is_animation_tainted = variable_data.IsAnimationTainted();
@@ -241,15 +195,11 @@
   }
   cycle_detected = false;
 
-  if (resolve_urls) {
-    ResolveRelativeUrls(result.tokens, result.backing_strings,
-                        variable_data.BaseURL(), variable_data.Charset());
-  }
-
   return CSSVariableData::CreateResolved(
       result.tokens, std::move(result.backing_strings),
       result.is_animation_tainted, result.has_font_units,
-      result.has_root_font_units, result.absolutized);
+      result.has_root_font_units, result.absolutized, variable_data.BaseURL(),
+      variable_data.Charset());
 }
 
 scoped_refptr<CSSVariableData>
@@ -259,21 +209,9 @@
     const Options& options,
     bool& cycle_detected) {
   DCHECK(variable_data);
-  bool resolve_urls = ShouldResolveRelativeUrls(name, *variable_data);
-  if (!variable_data->NeedsVariableResolution() && !resolve_urls)
+  if (!variable_data->NeedsVariableResolution())
     return variable_data;
-  return ResolveCustomProperty(name, *variable_data, options, resolve_urls,
-                               cycle_detected);
-}
-
-bool CSSVariableResolver::ShouldResolveRelativeUrls(
-    const AtomicString& name,
-    const CSSVariableData& variable_data) {
-  if (!variable_data.NeedsUrlResolution())
-    return false;
-  const PropertyRegistration* registration =
-      registry_ ? registry_->Registration(name) : nullptr;
-  return registration ? registration->Syntax().HasUrlSyntax() : false;
+  return ResolveCustomProperty(name, *variable_data, options, cycle_detected);
 }
 
 bool CSSVariableResolver::IsVariableDisallowed(
@@ -544,8 +482,7 @@
     return nullptr;
   }
 
-  bool resolve_urls = false;
-  return ResolveCustomProperty(name, *keyframe.Value(), Options(), resolve_urls,
+  return ResolveCustomProperty(name, *keyframe.Value(), Options(),
                                cycle_detected);
 }
 
diff --git a/third_party/blink/renderer/core/css/resolver/css_variable_resolver.h b/third_party/blink/renderer/core/css/resolver/css_variable_resolver.h
index cd3bbf3..1338e8c6 100644
--- a/third_party/blink/renderer/core/css/resolver/css_variable_resolver.h
+++ b/third_party/blink/renderer/core/css/resolver/css_variable_resolver.h
@@ -173,7 +173,6 @@
   scoped_refptr<CSSVariableData> ResolveCustomProperty(AtomicString name,
                                                        const CSSVariableData&,
                                                        const Options&,
-                                                       bool resolve_urls,
                                                        bool& cycle_detected);
   // Like ResolveCustomProperty, but returns the incoming CSSVariableData if
   // no resolution is needed.
@@ -183,9 +182,6 @@
       const Options&,
       bool& cycle_detected);
 
-  bool ShouldResolveRelativeUrls(const AtomicString& name,
-                                 const CSSVariableData&);
-
   bool IsVariableDisallowed(const CSSVariableData&,
                             const Options&,
                             const PropertyRegistration*);
diff --git a/third_party/blink/renderer/core/css/resolver/css_variable_resolver_test.cc b/third_party/blink/renderer/core/css/resolver/css_variable_resolver_test.cc
index c9ac015..eab50d1 100644
--- a/third_party/blink/renderer/core/css/resolver/css_variable_resolver_test.cc
+++ b/third_party/blink/renderer/core/css/resolver/css_variable_resolver_test.cc
@@ -196,23 +196,6 @@
   EXPECT_FALSE(non_inherited_variables->NeedsResolution());
 }
 
-TEST_F(CSSVariableResolverTest, UrlNeedsResolution) {
-  scoped_refptr<StyleInheritedVariables> inherited_variables =
-      StyleInheritedVariables::Create();
-  auto non_inherited_variables = std::make_unique<StyleNonInheritedVariables>();
-
-  EXPECT_FALSE(inherited_variables->NeedsResolution());
-  EXPECT_FALSE(non_inherited_variables->NeedsResolution());
-
-  const auto* prop = CreateCustomProperty("url(a)");
-
-  inherited_variables->SetVariable("--prop", prop->Value());
-  non_inherited_variables->SetVariable("--prop", prop->Value());
-
-  EXPECT_TRUE(inherited_variables->NeedsResolution());
-  EXPECT_TRUE(non_inherited_variables->NeedsResolution());
-}
-
 TEST_F(CSSVariableResolverTest, CopiedVariablesRetainNeedsResolution) {
   scoped_refptr<StyleInheritedVariables> inherited_variables =
       StyleInheritedVariables::Create();
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
index a0d3ca2..44e6585 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -1649,14 +1649,17 @@
     const Document& document,
     const StyleResolverState* state,
     const CSSToLengthConversionData& css_to_length_conversion_data,
-    const CSSValue& value) {
+    const CSSValue& value,
+    const String& base_url,
+    const WTF::TextEncoding& charset) {
   // TODO(timloh): Images values can also contain lengths.
   if (const auto* function_value = DynamicTo<CSSFunctionValue>(value)) {
     CSSFunctionValue* new_function =
         MakeGarbageCollected<CSSFunctionValue>(function_value->FunctionType());
     for (const CSSValue* inner_value : To<CSSValueList>(value)) {
       new_function->Append(ComputeRegisteredPropertyValue(
-          document, state, css_to_length_conversion_data, *inner_value));
+          document, state, css_to_length_conversion_data, *inner_value,
+          base_url, charset));
     }
     return *new_function;
   }
@@ -1665,7 +1668,8 @@
     CSSValueList* new_list = CSSValueList::CreateWithSeparatorFrom(*old_list);
     for (const CSSValue* inner_value : *old_list) {
       new_list->Append(ComputeRegisteredPropertyValue(
-          document, state, css_to_length_conversion_data, *inner_value));
+          document, state, css_to_length_conversion_data, *inner_value,
+          base_url, charset));
     }
     return *new_list;
   }
@@ -1729,21 +1733,28 @@
     }
   }
 
+  if (const auto* uri_value = DynamicTo<CSSURIValue>(value))
+    return *uri_value->ValueWithURLMadeAbsolute(KURL(base_url), charset);
+
   return value;
 }
 
 const CSSValue& StyleBuilderConverter::ConvertRegisteredPropertyInitialValue(
     const Document& document,
     const CSSValue& value) {
-  return ComputeRegisteredPropertyValue(document, nullptr /* state */,
-                                        CSSToLengthConversionData(), value);
+  return ComputeRegisteredPropertyValue(
+      document, nullptr /* state */, CSSToLengthConversionData(), value,
+      document.BaseURL(), document.Encoding());
 }
 
 const CSSValue& StyleBuilderConverter::ConvertRegisteredPropertyValue(
     const StyleResolverState& state,
-    const CSSValue& value) {
-  return ComputeRegisteredPropertyValue(
-      state.GetDocument(), &state, state.CssToLengthConversionData(), value);
+    const CSSValue& value,
+    const String& base_url,
+    const WTF::TextEncoding& charset) {
+  return ComputeRegisteredPropertyValue(state.GetDocument(), &state,
+                                        state.CssToLengthConversionData(),
+                                        value, base_url, charset);
 }
 
 // Registered properties need to substitute as absolute values. This means
@@ -1773,9 +1784,9 @@
   const bool has_root_font_units = false;
   const bool absolutized = true;
 
-  return CSSVariableData::CreateResolved(tokens, std::move(backing_strings),
-                                         is_animation_tainted, has_font_units,
-                                         has_root_font_units, absolutized);
+  return CSSVariableData::CreateResolved(
+      tokens, std::move(backing_strings), is_animation_tainted, has_font_units,
+      has_root_font_units, absolutized, g_null_atom, WTF::TextEncoding());
 }
 
 const CSSToLengthConversionData&
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
index fa3cb8e..1a6fe32 100644
--- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
+++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.h
@@ -52,6 +52,7 @@
 #include "third_party/blink/renderer/platform/text/tab_size.h"
 #include "third_party/blink/renderer/platform/transforms/rotation.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
+#include "third_party/blink/renderer/platform/wtf/text/text_encoding.h"
 
 namespace blink {
 
@@ -262,7 +263,9 @@
                                                                const CSSValue&);
   static const CSSValue& ConvertRegisteredPropertyValue(
       const StyleResolverState&,
-      const CSSValue&);
+      const CSSValue&,
+      const String& base_url,
+      const WTF::TextEncoding&);
 
   static scoped_refptr<CSSVariableData> ConvertRegisteredPropertyVariableData(
       const CSSValue&,
diff --git a/third_party/blink/renderer/core/css/style_environment_variables.cc b/third_party/blink/renderer/core/css/style_environment_variables.cc
index d74069c..f7b97c82 100644
--- a/third_party/blink/renderer/core/css/style_environment_variables.cc
+++ b/third_party/blink/renderer/core/css/style_environment_variables.cc
@@ -110,7 +110,7 @@
               CSSVariableData::CreateResolved(
                   tokens, backing_strings, false /* is_animation_tainted */,
                   false /* has_font_units */, false /* has_root_font_units*/,
-                  true /* absolutized */));
+                  true /* absolutized */, g_null_atom, WTF::TextEncoding()));
 }
 
 void StyleEnvironmentVariables::SetVariable(const UADefinedVariable name,
diff --git a/third_party/blink/renderer/core/dom/dom_implementation.cc b/third_party/blink/renderer/core/dom/dom_implementation.cc
index 0c51c31..1539758 100644
--- a/third_party/blink/renderer/core/dom/dom_implementation.cc
+++ b/third_party/blink/renderer/core/dom/dom_implementation.cc
@@ -266,19 +266,19 @@
   // We do not want QuickTime to take over all image types, obviously.
   if ((type == "application/pdf" || type == "text/pdf") && plugin_data &&
       plugin_data->SupportsMimeType(type)) {
-    return PluginDocument::Create(
+    return MakeGarbageCollected<PluginDocument>(
         init, plugin_data->PluginBackgroundColorForMimeType(type));
   }
   // multipart/x-mixed-replace is only supported for images.
   if (MIMETypeRegistry::IsSupportedImageResourceMIMEType(type) ||
       type == "multipart/x-mixed-replace") {
-    return ImageDocument::Create(init);
+    return MakeGarbageCollected<ImageDocument>(init);
   }
 
   // Check to see if the type can be played by our media player, if so create a
   // MediaDocument
   if (HTMLMediaElement::GetSupportsType(ContentType(type)))
-    return MediaDocument::Create(init);
+    return MakeGarbageCollected<MediaDocument>(init);
 
   // Everything else except text/plain can be overridden by plugins. In
   // particular, Adobe SVG Viewer should be used for SVG, if installed.
@@ -287,11 +287,11 @@
   // an optimization to prevent loading the plugin database in the common case.
   if (type != "text/plain" && plugin_data &&
       plugin_data->SupportsMimeType(type)) {
-    return PluginDocument::Create(
+    return MakeGarbageCollected<PluginDocument>(
         init, plugin_data->PluginBackgroundColorForMimeType(type));
   }
   if (IsTextMIMEType(type))
-    return TextDocument::Create(init);
+    return MakeGarbageCollected<TextDocument>(init);
   if (type == "image/svg+xml")
     return XMLDocument::CreateSVG(init);
   if (IsXMLMIMEType(type))
diff --git a/third_party/blink/renderer/core/editing/commands/insert_commands.cc b/third_party/blink/renderer/core/editing/commands/insert_commands.cc
index 00f5ea6..b4fc117a 100644
--- a/third_party/blink/renderer/core/editing/commands/insert_commands.cc
+++ b/third_party/blink/renderer/core/editing/commands/insert_commands.cc
@@ -111,8 +111,8 @@
                                         EditorCommandSource,
                                         const String& value) {
   DCHECK(frame.GetDocument());
-  HTMLImageElement* const image =
-      HTMLImageElement::Create(*frame.GetDocument());
+  auto* const image =
+      MakeGarbageCollected<HTMLImageElement>(*frame.GetDocument());
   if (!value.IsEmpty())
     image->SetSrc(value);
   return ExecuteInsertElement(frame, image);
diff --git a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
index d40a4d6..070d44b4 100644
--- a/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_dev_tools_agent_impl.cc
@@ -237,8 +237,8 @@
       isolate, inspected_frames, session->V8Session());
   session->Append(dom_agent);
 
-  InspectorLayerTreeAgent* layer_tree_agent =
-      InspectorLayerTreeAgent::Create(inspected_frames, this);
+  auto* layer_tree_agent =
+      MakeGarbageCollected<InspectorLayerTreeAgent>(inspected_frames, this);
   session->Append(layer_tree_agent);
 
   InspectorNetworkAgent* network_agent =
@@ -246,7 +246,7 @@
                                                   session->V8Session());
   session->Append(network_agent);
 
-  InspectorCSSAgent* css_agent = InspectorCSSAgent::Create(
+  auto* css_agent = MakeGarbageCollected<InspectorCSSAgent>(
       dom_agent, inspected_frames, network_agent,
       resource_content_loader_.Get(), resource_container_.Get());
   session->Append(css_agent);
@@ -256,19 +256,21 @@
                                                       session->V8Session());
   session->Append(dom_debugger_agent);
 
-  session->Append(
-      InspectorDOMSnapshotAgent::Create(inspected_frames, dom_debugger_agent));
+  session->Append(MakeGarbageCollected<InspectorDOMSnapshotAgent>(
+      inspected_frames, dom_debugger_agent));
 
   session->Append(MakeGarbageCollected<InspectorAnimationAgent>(
       inspected_frames, css_agent, session->V8Session()));
 
-  session->Append(InspectorMemoryAgent::Create(inspected_frames));
+  session->Append(MakeGarbageCollected<InspectorMemoryAgent>(inspected_frames));
 
-  session->Append(InspectorPerformanceAgent::Create(inspected_frames));
+  session->Append(
+      MakeGarbageCollected<InspectorPerformanceAgent>(inspected_frames));
 
-  session->Append(InspectorApplicationCacheAgent::Create(inspected_frames));
+  session->Append(
+      MakeGarbageCollected<InspectorApplicationCacheAgent>(inspected_frames));
 
-  InspectorPageAgent* page_agent = InspectorPageAgent::Create(
+  auto* page_agent = MakeGarbageCollected<InspectorPageAgent>(
       inspected_frames, this, resource_content_loader_.Get(),
       session->V8Session());
   session->Append(page_agent);
@@ -333,8 +335,9 @@
     : worker_client_(worker_client),
       web_local_frame_impl_(web_local_frame_impl),
       probe_sink_(web_local_frame_impl_->GetFrame()->GetProbeSink()),
-      resource_content_loader_(InspectorResourceContentLoader::Create(
-          web_local_frame_impl_->GetFrame())),
+      resource_content_loader_(
+          MakeGarbageCollected<InspectorResourceContentLoader>(
+              web_local_frame_impl_->GetFrame())),
       inspected_frames_(MakeGarbageCollected<InspectedFrames>(
           web_local_frame_impl_->GetFrame())),
       resource_container_(
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc
index 11526e99..c69decea 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -313,7 +313,7 @@
   if (does_composite_)
     AsView().page->GetSettings().SetAcceleratedCompositingEnabled(true);
 
-  dev_tools_emulator_ = DevToolsEmulator::Create(this);
+  dev_tools_emulator_ = MakeGarbageCollected<DevToolsEmulator>(this);
 
   AllInstances().insert(this);
 
@@ -1592,6 +1592,11 @@
   }
 }
 
+void WebViewImpl::RequestPresentationCallbackForTesting(
+    base::OnceClosure callback) {
+  layer_tree_view_->RequestPresentationCallback(std::move(callback));
+}
+
 void WebViewImpl::PaintContent(cc::PaintCanvas* canvas, const WebRect& rect) {
   // This should only be used when compositing is not being used for this
   // WebView, and it is painting into the recording of its parent.
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h
index cea7016..68d633f 100644
--- a/third_party/blink/renderer/core/exported/web_view_impl.h
+++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -443,6 +443,8 @@
   void RecordEndOfFrameMetrics(base::TimeTicks frame_begin_time) override;
   void UpdateLifecycle(LifecycleUpdate requested_update,
                        LifecycleUpdateReason reason) override;
+  void RequestPresentationCallbackForTesting(
+      base::OnceClosure callback) override;
   void PaintContent(cc::PaintCanvas*, const WebRect&) override;
   void ThemeChanged() override;
   WebInputEventResult HandleInputEvent(const WebCoalescedInputEvent&) override;
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy.cc b/third_party/blink/renderer/core/feature_policy/feature_policy.cc
index 225f7dc..8e14c48b 100644
--- a/third_party/blink/renderer/core/feature_policy/feature_policy.cc
+++ b/third_party/blink/renderer/core/feature_policy/feature_policy.cc
@@ -32,13 +32,8 @@
     return PolicyValue(2.0);
   }
   if (feature == mojom::FeaturePolicyFeature::kUnoptimizedLossyImages) {
-    // Lossy images default to at most 0.5 bytes per pixel.
     return PolicyValue(0.5);
   }
-  if (feature == mojom::FeaturePolicyFeature::kUnoptimizedLosslessImages) {
-    // Lossless images default to at most 1 byte per pixel.
-    return PolicyValue(1.0);
-  }
 
   return PolicyValue(false);
 }
diff --git a/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5 b/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
index 12ea924..3b26fcb 100644
--- a/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
+++ b/third_party/blink/renderer/core/feature_policy/feature_policy_features.json5
@@ -188,11 +188,6 @@
       depends_on: ["FeaturePolicyForSandbox"],
     },
     {
-      name: "UnoptimizedLosslessImages",
-      feature_policy_name: "unoptimized-lossless-images",
-      depends_on: ["ExperimentalProductivityFeatures"],
-    },
-    {
       name: "UnoptimizedLossyImages",
       feature_policy_name: "unoptimized-lossy-images",
       depends_on: ["UnoptimizedImagePolicies"],
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
index 8bc8bc1..d165254 100644
--- a/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
+++ b/third_party/blink/renderer/core/frame/web_frame_widget_base.cc
@@ -342,10 +342,11 @@
     base::OnceCallback<void(bool)> callback) {
   // If we have a LayerTreeView, propagate the request, otherwise fail it since
   // otherwise it would remain in a unresolved and unrejected state.
-  // TODO(danakj): This should be based on |does_composite| instead.
-  if (!GetLayerTreeView())
+  if (WebLayerTreeView* layer_tree_view = GetLayerTreeView()) {
+    layer_tree_view->RequestDecode(image, std::move(callback));
+  } else {
     std::move(callback).Run(false);
-  Client()->RequestDecode(image, std::move(callback));
+  }
 }
 
 void WebFrameWidgetBase::Trace(blink::Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
index 74ebd86..ff22a552 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
+++ b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.cc
@@ -58,14 +58,6 @@
   popup_ = chrome_client_->OpenPagePopup(this);
 }
 
-DateTimeChooserImpl* DateTimeChooserImpl::Create(
-    ChromeClient* chrome_client,
-    DateTimeChooserClient* client,
-    const DateTimeChooserParameters& parameters) {
-  return MakeGarbageCollected<DateTimeChooserImpl>(chrome_client, client,
-                                                   parameters);
-}
-
 DateTimeChooserImpl::~DateTimeChooserImpl() = default;
 
 void DateTimeChooserImpl::Trace(Visitor* visitor) {
diff --git a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
index 89b70648..41ee1fae 100644
--- a/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
+++ b/third_party/blink/renderer/core/html/forms/date_time_chooser_impl.h
@@ -45,10 +45,6 @@
 class CORE_EXPORT DateTimeChooserImpl final : public DateTimeChooser,
                                               public PagePopupClient {
  public:
-  static DateTimeChooserImpl* Create(ChromeClient*,
-                                     DateTimeChooserClient*,
-                                     const DateTimeChooserParameters&);
-
   DateTimeChooserImpl(ChromeClient*,
                       DateTimeChooserClient*,
                       const DateTimeChooserParameters&);
diff --git a/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc b/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
index 3846dc3..143b030 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_controls_collection.cc
@@ -134,7 +134,7 @@
   if (HasValidIdNameCache())
     return;
 
-  NamedItemCache* cache = NamedItemCache::Create();
+  auto* cache = MakeGarbageCollected<NamedItemCache>();
   HashSet<StringImpl*> found_input_elements;
 
   for (const auto& listed_element : ListedElements()) {
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 e01aa5de..54862c9d 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
@@ -158,7 +158,7 @@
 
 HTMLImageLoader& HTMLInputElement::EnsureImageLoader() {
   if (!image_loader_)
-    image_loader_ = HTMLImageLoader::Create(this);
+    image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
   return *image_loader_;
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
index 75f40ff..45b8d12 100644
--- a/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
+++ b/third_party/blink/renderer/core/html/forms/internal_popup_menu.cc
@@ -65,13 +65,6 @@
   USING_GARBAGE_COLLECTED_MIXIN(PopupMenuCSSFontSelector);
 
  public:
-  static PopupMenuCSSFontSelector* Create(
-      Document* document,
-      CSSFontSelector* owner_font_selector) {
-    return MakeGarbageCollected<PopupMenuCSSFontSelector>(document,
-                                                          owner_font_selector);
-  }
-
   PopupMenuCSSFontSelector(Document*, CSSFontSelector*);
   ~PopupMenuCSSFontSelector() override;
 
@@ -421,8 +414,9 @@
 
 void InternalPopupMenu::SelectFontsFromOwnerDocument(Document& document) {
   Document& owner_document = OwnerElement().GetDocument();
-  document.GetStyleEngine().SetFontSelector(PopupMenuCSSFontSelector::Create(
-      &document, owner_document.GetStyleEngine().GetFontSelector()));
+  document.GetStyleEngine().SetFontSelector(
+      MakeGarbageCollected<PopupMenuCSSFontSelector>(
+          &document, owner_document.GetStyleEngine().GetFontSelector()));
 }
 
 void InternalPopupMenu::SetValueAndClosePopup(int num_value,
diff --git a/third_party/blink/renderer/core/html/forms/listed_element.cc b/third_party/blink/renderer/core/html/forms/listed_element.cc
index f182a0e..ac137c54 100644
--- a/third_party/blink/renderer/core/html/forms/listed_element.cc
+++ b/third_party/blink/renderer/core/html/forms/listed_element.cc
@@ -54,9 +54,6 @@
 
 class FormAttributeTargetObserver : public IdTargetObserver {
  public:
-  static FormAttributeTargetObserver* Create(const AtomicString& id,
-                                             ListedElement*);
-
   FormAttributeTargetObserver(const AtomicString& id, ListedElement*);
 
   void Trace(Visitor*) override;
@@ -86,7 +83,7 @@
 
 ValidityState* ListedElement::validity() {
   if (!validity_state_)
-    validity_state_ = ValidityState::Create(this);
+    validity_state_ = MakeGarbageCollected<ValidityState>(this);
 
   return validity_state_.Get();
 }
@@ -634,7 +631,7 @@
   const AtomicString& form_id(element->FastGetAttribute(kFormAttr));
   if (!form_id.IsNull() && element->isConnected()) {
     SetFormAttributeTargetObserver(
-        FormAttributeTargetObserver::Create(form_id, this));
+        MakeGarbageCollected<FormAttributeTargetObserver>(form_id, this));
   } else {
     SetFormAttributeTargetObserver(nullptr);
   }
@@ -693,12 +690,6 @@
       ToHTMLElement(static_cast<const ListedElement&>(listed_element)));
 }
 
-FormAttributeTargetObserver* FormAttributeTargetObserver::Create(
-    const AtomicString& id,
-    ListedElement* element) {
-  return MakeGarbageCollected<FormAttributeTargetObserver>(id, element);
-}
-
 FormAttributeTargetObserver::FormAttributeTargetObserver(const AtomicString& id,
                                                          ListedElement* element)
     : IdTargetObserver(
diff --git a/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js b/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
index 9c224958..762ac43 100644
--- a/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
+++ b/third_party/blink/renderer/core/html/forms/resources/calendarPicker.js
@@ -105,10 +105,10 @@
   // limitation.
   if (year > ImperialEraLimit)
     return '';
-  if (year >= 2020 || year == 2019 && month >= 4) {
-    // TODO(tkent): Next of Heisei is not published yet.
-    return '';
-  }
+  if (year >= 2020)
+    return '(\u4ee4\u548c' + localizeNumber(year - 2018) + '\u5e74)';
+  if (year == 2019 && month >= 4)
+    return '(\u4ee4\u548c\u5143\u5e74)';
   if (year > 1989)
     return '(\u5e73\u6210' + localizeNumber(year - 1988) + '\u5e74)';
   if (year == 1989)
diff --git a/third_party/blink/renderer/core/html/forms/text_control_element.cc b/third_party/blink/renderer/core/html/forms/text_control_element.cc
index ea641f8b..f71a901 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_element.cc
@@ -1018,7 +1018,8 @@
 
 HTMLElement* TextControlElement::CreateInnerEditorElement() {
   DCHECK(!inner_editor_);
-  inner_editor_ = TextControlInnerEditorElement::Create(GetDocument());
+  inner_editor_ =
+      MakeGarbageCollected<TextControlInnerEditorElement>(GetDocument());
   return inner_editor_;
 }
 
diff --git a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
index 2021379f..8dae233 100644
--- a/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
+++ b/third_party/blink/renderer/core/html/forms/text_control_inner_elements.cc
@@ -92,8 +92,7 @@
 
 // ---------------------------
 
-inline TextControlInnerEditorElement::TextControlInnerEditorElement(
-    Document& document)
+TextControlInnerEditorElement::TextControlInnerEditorElement(Document& document)
     : HTMLDivElement(document) {
   SetHasCustomStyleCallbacks();
 }
diff --git a/third_party/blink/renderer/core/html/forms/validity_state.h b/third_party/blink/renderer/core/html/forms/validity_state.h
index 7e8ad13..df9283c 100644
--- a/third_party/blink/renderer/core/html/forms/validity_state.h
+++ b/third_party/blink/renderer/core/html/forms/validity_state.h
@@ -34,10 +34,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static ValidityState* Create(ListedElement* control) {
-    return MakeGarbageCollected<ValidityState>(control);
-  }
-
   explicit ValidityState(ListedElement* control) : control_(control) {}
 
   void Trace(Visitor* visitor) override {
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
index ed204777c..14ef29bb 100644
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -63,7 +63,7 @@
     : HTMLElement(tag_name, document),
       link_relations_(0),
       cached_visited_link_hash_(0),
-      rel_list_(RelList::Create(this)) {}
+      rel_list_(MakeGarbageCollected<RelList>(this)) {}
 
 HTMLAnchorElement* HTMLAnchorElement::Create(Document& document) {
   return MakeGarbageCollected<HTMLAnchorElement>(kATag, document);
diff --git a/third_party/blink/renderer/core/html/html_collection.cc b/third_party/blink/renderer/core/html/html_collection.cc
index 0abc7e93..c6f2b64 100644
--- a/third_party/blink/renderer/core/html/html_collection.cc
+++ b/third_party/blink/renderer/core/html/html_collection.cc
@@ -506,7 +506,7 @@
   if (HasValidIdNameCache())
     return;
 
-  NamedItemCache* cache = NamedItemCache::Create();
+  auto* cache = MakeGarbageCollected<NamedItemCache>();
   unsigned length = this->length();
   for (unsigned i = 0; i < length; ++i) {
     Element* element = item(i);
diff --git a/third_party/blink/renderer/core/html/html_collection.h b/third_party/blink/renderer/core/html/html_collection.h
index da968269..866cb99 100644
--- a/third_party/blink/renderer/core/html/html_collection.h
+++ b/third_party/blink/renderer/core/html/html_collection.h
@@ -117,10 +117,6 @@
  protected:
   class NamedItemCache final : public GarbageCollected<NamedItemCache> {
    public:
-    static NamedItemCache* Create() {
-      return MakeGarbageCollected<NamedItemCache>();
-    }
-
     NamedItemCache();
 
     const HeapVector<Member<Element>>* GetElementsById(
diff --git a/third_party/blink/renderer/core/html/html_embed_element.cc b/third_party/blink/renderer/core/html/html_embed_element.cc
index badfb76f..11a62a51 100644
--- a/third_party/blink/renderer/core/html/html_embed_element.cc
+++ b/third_party/blink/renderer/core/html/html_embed_element.cc
@@ -124,7 +124,7 @@
     SetUrl(StripLeadingAndTrailingHTMLSpaces(params.new_value));
     if (GetLayoutObject() && IsImageType()) {
       if (!image_loader_)
-        image_loader_ = HTMLImageLoader::Create(this);
+        image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
       image_loader_->UpdateFromElement(ImageLoader::kUpdateIgnorePreviousError);
     } else if (GetLayoutObject()) {
       // Check if this Embed can transition from potentially-active to active
diff --git a/third_party/blink/renderer/core/html/html_iframe_element.cc b/third_party/blink/renderer/core/html/html_iframe_element.cc
index 91fe879f..06a85f3c 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element.cc
+++ b/third_party/blink/renderer/core/html/html_iframe_element.cc
@@ -47,7 +47,7 @@
 inline HTMLIFrameElement::HTMLIFrameElement(Document& document)
     : HTMLFrameElementBase(kIFrameTag, document),
       collapsed_by_client_(false),
-      sandbox_(HTMLIFrameElementSandbox::Create(this)),
+      sandbox_(MakeGarbageCollected<HTMLIFrameElementSandbox>(this)),
       referrer_policy_(network::mojom::ReferrerPolicy::kDefault) {}
 
 DEFINE_NODE_FACTORY(HTMLIFrameElement)
diff --git a/third_party/blink/renderer/core/html/html_iframe_element_sandbox.h b/third_party/blink/renderer/core/html/html_iframe_element_sandbox.h
index 6feeaf41..5c34eb6d 100644
--- a/third_party/blink/renderer/core/html/html_iframe_element_sandbox.h
+++ b/third_party/blink/renderer/core/html/html_iframe_element_sandbox.h
@@ -14,10 +14,6 @@
 
 class HTMLIFrameElementSandbox final : public DOMTokenList {
  public:
-  static HTMLIFrameElementSandbox* Create(HTMLIFrameElement* element) {
-    return MakeGarbageCollected<HTMLIFrameElementSandbox>(element);
-  }
-
   explicit HTMLIFrameElementSandbox(HTMLIFrameElement*);
 
  private:
diff --git a/third_party/blink/renderer/core/html/html_image_element.cc b/third_party/blink/renderer/core/html/html_image_element.cc
index 14b4f4e..726f70a 100644
--- a/third_party/blink/renderer/core/html/html_image_element.cc
+++ b/third_party/blink/renderer/core/html/html_image_element.cc
@@ -74,10 +74,6 @@
 class HTMLImageElement::ViewportChangeListener final
     : public MediaQueryListListener {
  public:
-  static ViewportChangeListener* Create(HTMLImageElement* element) {
-    return MakeGarbageCollected<ViewportChangeListener>(element);
-  }
-
   explicit ViewportChangeListener(HTMLImageElement* element)
       : element_(element) {}
 
@@ -97,7 +93,7 @@
 
 HTMLImageElement::HTMLImageElement(Document& document, bool created_by_parser)
     : HTMLElement(kImgTag, document),
-      image_loader_(HTMLImageLoader::Create(this)),
+      image_loader_(MakeGarbageCollected<HTMLImageLoader>(this)),
       image_device_pixel_ratio_(1.0f),
       source_(nullptr),
       layout_disposition_(LayoutDisposition::kPrimaryContent),
@@ -267,7 +263,7 @@
 
   if (intrinsic_sizing_viewport_dependant) {
     if (!listener_)
-      listener_ = ViewportChangeListener::Create(this);
+      listener_ = MakeGarbageCollected<ViewportChangeListener>(this);
 
     GetDocument().GetMediaQueryMatcher().AddViewportListener(listener_);
   } else if (listener_) {
diff --git a/third_party/blink/renderer/core/html/html_image_element_test.cc b/third_party/blink/renderer/core/html/html_image_element_test.cc
index a84a3d1d..55f39e8 100644
--- a/third_party/blink/renderer/core/html/html_image_element_test.cc
+++ b/third_party/blink/renderer/core/html/html_image_element_test.cc
@@ -27,7 +27,7 @@
 constexpr int HTMLImageElementTest::kViewportHeight;
 
 TEST_F(HTMLImageElementTest, width) {
-  auto* image = HTMLImageElement::Create(GetDocument());
+  auto* image = MakeGarbageCollected<HTMLImageElement>(GetDocument());
   image->setAttribute(html_names::kWidthAttr, "400");
   // TODO(yoav): `width` does not impact resourceWidth until we resolve
   // https://github.com/ResponsiveImagesCG/picture-element/issues/268
@@ -37,7 +37,7 @@
 }
 
 TEST_F(HTMLImageElementTest, sourceSize) {
-  auto* image = HTMLImageElement::Create(GetDocument());
+  auto* image = MakeGarbageCollected<HTMLImageElement>(GetDocument());
   image->setAttribute(html_names::kWidthAttr, "400");
   EXPECT_EQ(kViewportWidth, image->SourceSize(*image));
   image->setAttribute(html_names::kSizesAttr, "50vw");
diff --git a/third_party/blink/renderer/core/html/html_image_fallback_helper.cc b/third_party/blink/renderer/core/html/html_image_fallback_helper.cc
index 96134bd..749dd8e 100644
--- a/third_party/blink/renderer/core/html/html_image_fallback_helper.cc
+++ b/third_party/blink/renderer/core/html/html_image_fallback_helper.cc
@@ -54,8 +54,8 @@
   root.AppendChild(container);
   container->setAttribute(kIdAttr, AtomicString("alttext-container"));
 
-  HTMLImageElement* broken_image =
-      HTMLImageElement::Create(element.GetDocument());
+  auto* broken_image =
+      MakeGarbageCollected<HTMLImageElement>(element.GetDocument());
   container->AppendChild(broken_image);
   broken_image->SetIsFallbackImage();
   broken_image->setAttribute(kIdAttr, AtomicString("alttext-image"));
diff --git a/third_party/blink/renderer/core/html/html_image_loader.h b/third_party/blink/renderer/core/html/html_image_loader.h
index d4155e1..738daaf 100644
--- a/third_party/blink/renderer/core/html/html_image_loader.h
+++ b/third_party/blink/renderer/core/html/html_image_loader.h
@@ -30,10 +30,6 @@
 
 class CORE_EXPORT HTMLImageLoader final : public ImageLoader {
  public:
-  static HTMLImageLoader* Create(Element* element) {
-    return MakeGarbageCollected<HTMLImageLoader>(element);
-  }
-
   explicit HTMLImageLoader(Element*);
   ~HTMLImageLoader() override;
 
diff --git a/third_party/blink/renderer/core/html/html_link_element.cc b/third_party/blink/renderer/core/html/html_link_element.cc
index 1cbb6e9..2b45f513 100644
--- a/third_party/blink/renderer/core/html/html_link_element.cc
+++ b/third_party/blink/renderer/core/html/html_link_element.cc
@@ -57,7 +57,7 @@
       link_loader_(LinkLoader::Create(this)),
       referrer_policy_(network::mojom::ReferrerPolicy::kDefault),
       sizes_(MakeGarbageCollected<DOMTokenList>(*this, html_names::kSizesAttr)),
-      rel_list_(RelList::Create(this)),
+      rel_list_(MakeGarbageCollected<RelList>(this)),
       created_by_parser_(flags.IsCreatedByParser()) {}
 
 HTMLLinkElement* HTMLLinkElement::Create(Document& document,
@@ -192,11 +192,11 @@
         (!RuntimeEnabledFeatures::HTMLImportsOnlyChromeEnabled() ||
          (Href().Protocol() == "chrome" ||
           Href().Protocol() == "chrome-extension"))) {
-      link_ = LinkImport::Create(this);
+      link_ = MakeGarbageCollected<LinkImport>(this);
     } else if (rel_attribute_.IsManifest()) {
       link_ = LinkManifest::Create(this);
     } else {
-      LinkStyle* link = LinkStyle::Create(this);
+      auto* link = MakeGarbageCollected<LinkStyle>(this);
       if (FastHasAttribute(kDisabledAttr)) {
         UseCounter::Count(GetDocument(), WebFeature::kHTMLLinkElementDisabled);
         link->SetDisabledState(true);
diff --git a/third_party/blink/renderer/core/html/html_object_element.cc b/third_party/blink/renderer/core/html/html_object_element.cc
index 09ba3a51..d7e15be 100644
--- a/third_party/blink/renderer/core/html/html_object_element.cc
+++ b/third_party/blink/renderer/core/html/html_object_element.cc
@@ -119,7 +119,7 @@
     if (GetLayoutObject() && IsImageType()) {
       SetNeedsPluginUpdate(true);
       if (!image_loader_)
-        image_loader_ = HTMLImageLoader::Create(this);
+        image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
       image_loader_->UpdateFromElement(ImageLoader::kUpdateIgnorePreviousError);
     } else {
       ReloadPluginOnAttributeChange(name);
diff --git a/third_party/blink/renderer/core/html/html_plugin_element.cc b/third_party/blink/renderer/core/html/html_plugin_element.cc
index ac97bd8..27eb00fe 100644
--- a/third_party/blink/renderer/core/html/html_plugin_element.cc
+++ b/third_party/blink/renderer/core/html/html_plugin_element.cc
@@ -761,7 +761,7 @@
   if (IsImageType() && !GetLayoutObject() && style &&
       LayoutObjectIsNeeded(*style)) {
     if (!image_loader_)
-      image_loader_ = HTMLImageLoader::Create(this);
+      image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
     image_loader_->UpdateFromElement();
   }
   return style;
diff --git a/third_party/blink/renderer/core/html/image_document.cc b/third_party/blink/renderer/core/html/image_document.cc
index 899b841..ebf6df3 100644
--- a/third_party/blink/renderer/core/html/image_document.cc
+++ b/third_party/blink/renderer/core/html/image_document.cc
@@ -63,10 +63,6 @@
 
 class ImageEventListener : public NativeEventListener {
  public:
-  static ImageEventListener* Create(ImageDocument* document) {
-    return MakeGarbageCollected<ImageEventListener>(document);
-  }
-
   ImageEventListener(ImageDocument* document) : doc_(document) {}
 
   bool Matches(const EventListener& other) const override;
@@ -96,10 +92,6 @@
 
 class ImageDocumentParser : public RawDataDocumentParser {
  public:
-  static ImageDocumentParser* Create(ImageDocument* document) {
-    return MakeGarbageCollected<ImageDocumentParser>(document);
-  }
-
   ImageDocumentParser(ImageDocument* document)
       : RawDataDocumentParser(document) {}
 
@@ -213,7 +205,7 @@
 }
 
 DocumentParser* ImageDocument::CreateParser() {
-  return ImageDocumentParser::Create(this);
+  return MakeGarbageCollected<ImageDocumentParser>(this);
 }
 
 IntSize ImageDocument::ImageSize() const {
@@ -271,7 +263,7 @@
 
   WillInsertBody();
 
-  image_element_ = HTMLImageElement::Create(*this);
+  image_element_ = MakeGarbageCollected<HTMLImageElement>(*this);
   UpdateImageStyle();
   image_element_->SetLoadingImageDocument();
   image_element_->SetSrc(Url().GetString());
@@ -283,7 +275,7 @@
 
   if (ShouldShrinkToFit()) {
     // Add event listeners
-    EventListener* listener = ImageEventListener::Create(this);
+    auto* listener = MakeGarbageCollected<ImageEventListener>(this);
     if (LocalDOMWindow* dom_window = domWindow())
       dom_window->addEventListener(event_type_names::kResize, listener, false);
 
diff --git a/third_party/blink/renderer/core/html/image_document.h b/third_party/blink/renderer/core/html/image_document.h
index 381272aa..b129cf3 100644
--- a/third_party/blink/renderer/core/html/image_document.h
+++ b/third_party/blink/renderer/core/html/image_document.h
@@ -36,10 +36,6 @@
 
 class CORE_EXPORT ImageDocument final : public HTMLDocument {
  public:
-  static ImageDocument* Create(const DocumentInit& initializer) {
-    return MakeGarbageCollected<ImageDocument>(initializer);
-  }
-
   explicit ImageDocument(const DocumentInit&);
 
   ImageResourceContent* CachedImage();
diff --git a/third_party/blink/renderer/core/html/imports/link_import.cc b/third_party/blink/renderer/core/html/imports/link_import.cc
index e0b4360..c5fc72d 100644
--- a/third_party/blink/renderer/core/html/imports/link_import.cc
+++ b/third_party/blink/renderer/core/html/imports/link_import.cc
@@ -47,10 +47,6 @@
 
 namespace blink {
 
-LinkImport* LinkImport::Create(HTMLLinkElement* owner) {
-  return MakeGarbageCollected<LinkImport>(owner);
-}
-
 LinkImport::LinkImport(HTMLLinkElement* owner)
     : LinkResource(owner), child_(nullptr) {}
 
diff --git a/third_party/blink/renderer/core/html/imports/link_import.h b/third_party/blink/renderer/core/html/imports/link_import.h
index 4740f6c..e6586e1a 100644
--- a/third_party/blink/renderer/core/html/imports/link_import.h
+++ b/third_party/blink/renderer/core/html/imports/link_import.h
@@ -48,8 +48,6 @@
   USING_GARBAGE_COLLECTED_MIXIN(LinkImport);
 
  public:
-  static LinkImport* Create(HTMLLinkElement* owner);
-
   explicit LinkImport(HTMLLinkElement* owner);
   ~LinkImport() final;
 
diff --git a/third_party/blink/renderer/core/html/link_style.cc b/third_party/blink/renderer/core/html/link_style.cc
index 4998764e..e914f08 100644
--- a/third_party/blink/renderer/core/html/link_style.cc
+++ b/third_party/blink/renderer/core/html/link_style.cc
@@ -36,10 +36,6 @@
          MIMETypeRegistry::IsSupportedStyleSheetMIMEType(trimmed_type);
 }
 
-LinkStyle* LinkStyle::Create(HTMLLinkElement* owner) {
-  return MakeGarbageCollected<LinkStyle>(owner);
-}
-
 LinkStyle::LinkStyle(HTMLLinkElement* owner)
     : LinkResource(owner),
       disabled_state_(kUnset),
diff --git a/third_party/blink/renderer/core/html/link_style.h b/third_party/blink/renderer/core/html/link_style.h
index 22e838ca..5c56f2d 100644
--- a/third_party/blink/renderer/core/html/link_style.h
+++ b/third_party/blink/renderer/core/html/link_style.h
@@ -29,8 +29,6 @@
   USING_GARBAGE_COLLECTED_MIXIN(LinkStyle);
 
  public:
-  static LinkStyle* Create(HTMLLinkElement* owner);
-
   explicit LinkStyle(HTMLLinkElement* owner);
   ~LinkStyle() override;
 
diff --git a/third_party/blink/renderer/core/html/media/autoplay_policy.cc b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
index 81a5167..77733386 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_policy.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_policy.cc
@@ -165,7 +165,7 @@
 AutoplayPolicy::AutoplayPolicy(HTMLMediaElement* element)
     : locked_pending_user_gesture_(false),
       element_(element),
-      autoplay_uma_helper_(AutoplayUmaHelper::Create(element)) {
+      autoplay_uma_helper_(MakeGarbageCollected<AutoplayUmaHelper>(element)) {
   locked_pending_user_gesture_ =
       ComputeLockPendingUserGestureRequired(element->GetDocument());
 }
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
index 8ab2e83..f692065 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
+++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.cc
@@ -52,10 +52,6 @@
 
 }  // namespace
 
-AutoplayUmaHelper* AutoplayUmaHelper::Create(HTMLMediaElement* element) {
-  return MakeGarbageCollected<AutoplayUmaHelper>(element);
-}
-
 AutoplayUmaHelper::AutoplayUmaHelper(HTMLMediaElement* element)
     : ContextLifecycleObserver(nullptr),
       element_(element),
diff --git a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
index c3eed3a..fdce3cc 100644
--- a/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
+++ b/third_party/blink/renderer/core/html/media/autoplay_uma_helper.h
@@ -56,8 +56,6 @@
   USING_GARBAGE_COLLECTED_MIXIN(AutoplayUmaHelper);
 
  public:
-  static AutoplayUmaHelper* Create(HTMLMediaElement*);
-
   explicit AutoplayUmaHelper(HTMLMediaElement*);
   ~AutoplayUmaHelper() override;
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 84e9795..7132934 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -504,13 +504,13 @@
       tracks_are_ready_(true),
       processing_preference_change_(false),
       was_always_muted_(true),
-      audio_tracks_(AudioTrackList::Create(*this)),
-      video_tracks_(VideoTrackList::Create(*this)),
+      audio_tracks_(MakeGarbageCollected<AudioTrackList>(*this)),
+      video_tracks_(MakeGarbageCollected<VideoTrackList>(*this)),
       audio_source_node_(nullptr),
       autoplay_policy_(MakeGarbageCollected<AutoplayPolicy>(this)),
       remote_playback_client_(nullptr),
       media_controls_(nullptr),
-      controls_list_(HTMLMediaElementControlsList::Create(this)),
+      controls_list_(MakeGarbageCollected<HTMLMediaElementControlsList>(this)),
       lazy_load_intersection_observer_(nullptr) {
   DVLOG(1) << "HTMLMediaElement(" << (void*)this << ")";
 
@@ -1539,7 +1539,8 @@
 
   // 1 - Set the error attribute to a new MediaError object whose code attribute
   // is set to MEDIA_ERR_SRC_NOT_SUPPORTED.
-  error_ = MediaError::Create(MediaError::kMediaErrSrcNotSupported, message);
+  error_ = MakeGarbageCollected<MediaError>(
+      MediaError::kMediaErrSrcNotSupported, message);
 
   // 2 - Forget the media element's media-resource-specific text tracks.
   ForgetResourceSpecificTracks();
@@ -1659,9 +1660,11 @@
 
   if (error == WebMediaPlayer::kNetworkStateNetworkError &&
       ready_state_ >= kHaveMetadata) {
-    MediaEngineError(MediaError::Create(MediaError::kMediaErrNetwork, message));
+    MediaEngineError(MakeGarbageCollected<MediaError>(
+        MediaError::kMediaErrNetwork, message));
   } else if (error == WebMediaPlayer::kNetworkStateDecodeError) {
-    MediaEngineError(MediaError::Create(MediaError::kMediaErrDecode, message));
+    MediaEngineError(
+        MakeGarbageCollected<MediaError>(MediaError::kMediaErrDecode, message));
   } else if ((error == WebMediaPlayer::kNetworkStateFormatError ||
               error == WebMediaPlayer::kNetworkStateNetworkError) &&
              load_state_ == kLoadingFromSrcAttr) {
@@ -2788,8 +2791,8 @@
   if (selected && videoTracks().selectedIndex() != -1)
     selected = false;
 
-  VideoTrack* video_track =
-      VideoTrack::Create(id, kind_string, label, language, selected);
+  auto* video_track = MakeGarbageCollected<VideoTrack>(id, kind_string, label,
+                                                       language, selected);
   videoTracks().Add(video_track);
 
   return video_track->id();
@@ -2805,7 +2808,7 @@
   // 4.8.12.11.2 Sourcing in-band text tracks
   // 1. Associate the relevant data with a new text track and its corresponding
   // new TextTrack object.
-  InbandTextTrack* text_track = InbandTextTrack::Create(web_track);
+  auto* text_track = MakeGarbageCollected<InbandTextTrack>(web_track);
 
   // 2. Set the new text track's kind, label, and language based on the
   // semantics of the relevant data, as defined by the relevant specification.
@@ -2907,7 +2910,7 @@
 
 TextTrackList* HTMLMediaElement::textTracks() {
   if (!text_tracks_)
-    text_tracks_ = TextTrackList::Create(this);
+    text_tracks_ = MakeGarbageCollected<TextTrackList>(this);
 
   return text_tracks_.Get();
 }
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
index 454b2dc8..c173760 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element_event_listeners_test.cc
@@ -80,10 +80,6 @@
 
 class MediaStubLocalFrameClient : public EmptyLocalFrameClient {
  public:
-  static MediaStubLocalFrameClient* Create() {
-    return MakeGarbageCollected<MediaStubLocalFrameClient>();
-  }
-
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
       HTMLMediaElement&,
       const WebMediaPlayerSource&,
@@ -102,7 +98,8 @@
 class HTMLMediaElementEventListenersTest : public PageTestBase {
  protected:
   void SetUp() override {
-    SetupPageWithClients(nullptr, MediaStubLocalFrameClient::Create());
+    SetupPageWithClients(nullptr,
+                         MakeGarbageCollected<MediaStubLocalFrameClient>());
   }
 
   void DestroyDocument() { PageTestBase::TearDown(); }
@@ -240,10 +237,6 @@
 
 class MockEventListener final : public NativeEventListener {
  public:
-  static MockEventListener* Create() {
-    return MakeGarbageCollected<MockEventListener>();
-  }
-
   MOCK_METHOD2(Invoke, void(ExecutionContext* executionContext, Event*));
 };
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element_test.cc b/third_party/blink/renderer/core/html/media/html_media_element_test.cc
index 29146d1..5efa46c1 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element_test.cc
@@ -44,13 +44,7 @@
 
 class WebMediaStubLocalFrameClient : public EmptyLocalFrameClient {
  public:
-  static WebMediaStubLocalFrameClient* Create(
-      std::unique_ptr<WebMediaPlayer> player) {
-    return MakeGarbageCollected<WebMediaStubLocalFrameClient>(
-        std::move(player));
-  }
-
-  WebMediaStubLocalFrameClient(std::unique_ptr<WebMediaPlayer> player)
+  explicit WebMediaStubLocalFrameClient(std::unique_ptr<WebMediaPlayer> player)
       : player_(std::move(player)) {}
 
   std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
@@ -93,7 +87,8 @@
 
     dummy_page_holder_ = std::make_unique<DummyPageHolder>(
         IntSize(), nullptr,
-        WebMediaStubLocalFrameClient::Create(std::move(mock_media_player)),
+        MakeGarbageCollected<WebMediaStubLocalFrameClient>(
+            std::move(mock_media_player)),
         nullptr);
 
     if (GetParam() == MediaTestParam::kAudio)
@@ -290,7 +285,7 @@
   EXPECT_FALSE(Media()->ended());
   EXPECT_TRUE(CouldPlayIfEnoughData());
 
-  SetError(MediaError::Create(MediaError::kMediaErrDecode, ""));
+  SetError(MakeGarbageCollected<MediaError>(MediaError::kMediaErrDecode, ""));
   EXPECT_FALSE(CouldPlayIfEnoughData());
 }
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_test_helper.cc b/third_party/blink/renderer/core/html/media/html_media_test_helper.cc
index 88e2948..e95104c8 100644
--- a/third_party/blink/renderer/core/html/media/html_media_test_helper.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_test_helper.cc
@@ -9,12 +9,6 @@
 namespace blink {
 namespace test {
 
-// static
-MediaStubLocalFrameClient* MediaStubLocalFrameClient::Create(
-    std::unique_ptr<WebMediaPlayer> player) {
-  return MakeGarbageCollected<MediaStubLocalFrameClient>(std::move(player));
-}
-
 MediaStubLocalFrameClient::MediaStubLocalFrameClient(
     std::unique_ptr<WebMediaPlayer> player)
     : player_(std::move(player)) {}
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 3be4faf..57d987b8 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
@@ -165,7 +165,7 @@
   UpdateDisplayState();
   if (ShouldDisplayPosterImage()) {
     if (!image_loader_)
-      image_loader_ = HTMLImageLoader::Create(this);
+      image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
     image_loader_->UpdateFromElement();
     if (GetLayoutObject()) {
       ToLayoutImage(GetLayoutObject())
@@ -207,7 +207,7 @@
     }
     if (!PosterImageURL().IsEmpty()) {
       if (!image_loader_)
-        image_loader_ = HTMLImageLoader::Create(this);
+        image_loader_ = MakeGarbageCollected<HTMLImageLoader>(this);
       image_loader_->UpdateFromElement(ImageLoader::kUpdateIgnorePreviousError);
     } else {
       if (GetLayoutObject()) {
diff --git a/third_party/blink/renderer/core/html/media/html_video_element_test.cc b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
index f637980f1..4c0355a 100644
--- a/third_party/blink/renderer/core/html/media/html_video_element_test.cc
+++ b/third_party/blink/renderer/core/html/media/html_video_element_test.cc
@@ -32,10 +32,10 @@
         std::make_unique<HTMLVideoElementMockMediaPlayer>();
     media_player_ = mock_media_player.get();
 
-    SetupPageWithClients(
-        nullptr,
-        test::MediaStubLocalFrameClient::Create(std::move(mock_media_player)),
-        nullptr);
+    SetupPageWithClients(nullptr,
+                         MakeGarbageCollected<test::MediaStubLocalFrameClient>(
+                             std::move(mock_media_player)),
+                         nullptr);
     video_ = HTMLVideoElement::Create(GetDocument());
     GetDocument().body()->appendChild(video_);
   }
diff --git a/third_party/blink/renderer/core/html/media/media_document.h b/third_party/blink/renderer/core/html/media/media_document.h
index 9b68b0d..d990ce9 100644
--- a/third_party/blink/renderer/core/html/media/media_document.h
+++ b/third_party/blink/renderer/core/html/media/media_document.h
@@ -32,11 +32,7 @@
 
 class MediaDocument final : public HTMLDocument {
  public:
-  static MediaDocument* Create(const DocumentInit& initializer) {
-    return MakeGarbageCollected<MediaDocument>(initializer);
-  }
-
-  MediaDocument(const DocumentInit&);
+  explicit MediaDocument(const DocumentInit&);
 
  private:
   DocumentParser* CreateParser() override;
diff --git a/third_party/blink/renderer/core/html/media/media_error.h b/third_party/blink/renderer/core/html/media/media_error.h
index 1bf2f00d..7644d0d2 100644
--- a/third_party/blink/renderer/core/html/media/media_error.h
+++ b/third_party/blink/renderer/core/html/media/media_error.h
@@ -43,10 +43,6 @@
     kMediaErrSrcNotSupported,
   };
 
-  static MediaError* Create(ErrorCode code, const String& message) {
-    return MakeGarbageCollected<MediaError>(code, message);
-  }
-
   MediaError(ErrorCode code, const String& message)
       : code_(code), message_(message) {}
 
diff --git a/third_party/blink/renderer/core/html/media/media_remoting_interstitial.cc b/third_party/blink/renderer/core/html/media/media_remoting_interstitial.cc
index c729957a..422d87b 100644
--- a/third_party/blink/renderer/core/html/media/media_remoting_interstitial.cc
+++ b/third_party/blink/renderer/core/html/media/media_remoting_interstitial.cc
@@ -31,7 +31,7 @@
           &MediaRemotingInterstitial::ToggleInterstitialTimerFired),
       video_element_(&videoElement) {
   SetShadowPseudoId(AtomicString("-internal-media-interstitial"));
-  background_image_ = HTMLImageElement::Create(GetDocument());
+  background_image_ = MakeGarbageCollected<HTMLImageElement>(GetDocument());
   background_image_->SetShadowPseudoId(
       AtomicString("-internal-media-interstitial-background-image"));
   background_image_->SetSrc(videoElement.getAttribute(html_names::kPosterAttr));
diff --git a/third_party/blink/renderer/core/html/media/picture_in_picture_interstitial.cc b/third_party/blink/renderer/core/html/media/picture_in_picture_interstitial.cc
index 5176f0a..26e70c15f 100644
--- a/third_party/blink/renderer/core/html/media/picture_in_picture_interstitial.cc
+++ b/third_party/blink/renderer/core/html/media/picture_in_picture_interstitial.cc
@@ -67,7 +67,7 @@
       video_element_(&videoElement) {
   SetShadowPseudoId(AtomicString("-internal-media-interstitial"));
 
-  background_image_ = HTMLImageElement::Create(GetDocument());
+  background_image_ = MakeGarbageCollected<HTMLImageElement>(GetDocument());
   background_image_->SetShadowPseudoId(
       AtomicString("-internal-media-interstitial-background-image"));
   background_image_->SetSrc(videoElement.getAttribute(html_names::kPosterAttr));
diff --git a/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc b/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
index fa03aad..c2661ecb 100644
--- a/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
+++ b/third_party/blink/renderer/core/html/media/video_wake_lock_test.cc
@@ -64,11 +64,6 @@
 
 class VideoWakeLockFrameClient : public test::MediaStubLocalFrameClient {
  public:
-  static VideoWakeLockFrameClient* Create(
-      std::unique_ptr<WebMediaPlayer> player) {
-    return MakeGarbageCollected<VideoWakeLockFrameClient>(std::move(player));
-  }
-
   explicit VideoWakeLockFrameClient(std::unique_ptr<WebMediaPlayer> player)
       : test::MediaStubLocalFrameClient(std::move(player)),
         interface_provider_(new service_manager::InterfaceProvider()) {}
@@ -87,7 +82,7 @@
  public:
   void SetUp() override {
     PageTestBase::SetupPageWithClients(
-        nullptr, VideoWakeLockFrameClient::Create(
+        nullptr, MakeGarbageCollected<VideoWakeLockFrameClient>(
                      std::make_unique<VideoWakeLockMediaPlayer>()));
 
     service_manager::InterfaceProvider::TestApi test_api(
diff --git a/third_party/blink/renderer/core/html/plugin_document.h b/third_party/blink/renderer/core/html/plugin_document.h
index 1cb78d9..998a4342 100644
--- a/third_party/blink/renderer/core/html/plugin_document.h
+++ b/third_party/blink/renderer/core/html/plugin_document.h
@@ -36,11 +36,6 @@
 
 class CORE_EXPORT PluginDocument final : public HTMLDocument {
  public:
-  static PluginDocument* Create(const DocumentInit& initializer,
-                                Color background_color) {
-    return MakeGarbageCollected<PluginDocument>(initializer, background_color);
-  }
-
   PluginDocument(const DocumentInit&, Color background_color);
 
   void SetPluginNode(HTMLPlugInElement* plugin_node) {
diff --git a/third_party/blink/renderer/core/html/rel_list.h b/third_party/blink/renderer/core/html/rel_list.h
index 62c0c9e7..fc04510b 100644
--- a/third_party/blink/renderer/core/html/rel_list.h
+++ b/third_party/blink/renderer/core/html/rel_list.h
@@ -11,10 +11,6 @@
 
 class RelList final : public DOMTokenList {
  public:
-  static RelList* Create(Element* element) {
-    return MakeGarbageCollected<RelList>(element);
-  }
-
   explicit RelList(Element*);
 
  private:
diff --git a/third_party/blink/renderer/core/html/text_document.h b/third_party/blink/renderer/core/html/text_document.h
index bdff443..8610be8 100644
--- a/third_party/blink/renderer/core/html/text_document.h
+++ b/third_party/blink/renderer/core/html/text_document.h
@@ -31,11 +31,7 @@
 
 class TextDocument final : public HTMLDocument {
  public:
-  static TextDocument* Create(const DocumentInit& initializer) {
-    return MakeGarbageCollected<TextDocument>(initializer);
-  }
-
-  TextDocument(const DocumentInit&);
+  explicit TextDocument(const DocumentInit&);
 
  private:
   DocumentParser* CreateParser() override;
diff --git a/third_party/blink/renderer/core/html/track/audio_track_list.cc b/third_party/blink/renderer/core/html/track/audio_track_list.cc
index e9374a9a..99504757 100644
--- a/third_party/blink/renderer/core/html/track/audio_track_list.cc
+++ b/third_party/blink/renderer/core/html/track/audio_track_list.cc
@@ -6,10 +6,6 @@
 
 namespace blink {
 
-AudioTrackList* AudioTrackList::Create(HTMLMediaElement& media_element) {
-  return MakeGarbageCollected<AudioTrackList>(media_element);
-}
-
 AudioTrackList::~AudioTrackList() = default;
 
 AudioTrackList::AudioTrackList(HTMLMediaElement& media_element)
diff --git a/third_party/blink/renderer/core/html/track/html_track_element.cc b/third_party/blink/renderer/core/html/track/html_track_element.cc
index 09fc618..2188829 100644
--- a/third_party/blink/renderer/core/html/track/html_track_element.cc
+++ b/third_party/blink/renderer/core/html/track/html_track_element.cc
@@ -128,7 +128,7 @@
 LoadableTextTrack* HTMLTrackElement::EnsureTrack() {
   if (!track_) {
     // kind, label and language are updated by parseAttribute
-    track_ = LoadableTextTrack::Create(this);
+    track_ = MakeGarbageCollected<LoadableTextTrack>(this);
   }
   return track_.Get();
 }
diff --git a/third_party/blink/renderer/core/html/track/inband_text_track.cc b/third_party/blink/renderer/core/html/track/inband_text_track.cc
index 3c0f256..2eeb504 100644
--- a/third_party/blink/renderer/core/html/track/inband_text_track.cc
+++ b/third_party/blink/renderer/core/html/track/inband_text_track.cc
@@ -59,10 +59,6 @@
 
 }  // namespace
 
-InbandTextTrack* InbandTextTrack::Create(WebInbandTextTrack* web_track) {
-  return MakeGarbageCollected<InbandTextTrack>(web_track);
-}
-
 InbandTextTrack::InbandTextTrack(WebInbandTextTrack* web_track)
     : TextTrack(TextTrackKindToString(web_track->GetKind()),
                 web_track->Label(),
diff --git a/third_party/blink/renderer/core/html/track/inband_text_track.h b/third_party/blink/renderer/core/html/track/inband_text_track.h
index 819df92f..06bd261 100644
--- a/third_party/blink/renderer/core/html/track/inband_text_track.h
+++ b/third_party/blink/renderer/core/html/track/inband_text_track.h
@@ -41,8 +41,6 @@
 class InbandTextTrack final : public TextTrack,
                               public WebInbandTextTrackClient {
  public:
-  static InbandTextTrack* Create(WebInbandTextTrack*);
-
   explicit InbandTextTrack(WebInbandTextTrack*);
   ~InbandTextTrack() override;
 
diff --git a/third_party/blink/renderer/core/html/track/loadable_text_track.h b/third_party/blink/renderer/core/html/track/loadable_text_track.h
index f27a7e1..e9b096d1 100644
--- a/third_party/blink/renderer/core/html/track/loadable_text_track.h
+++ b/third_party/blink/renderer/core/html/track/loadable_text_track.h
@@ -36,10 +36,6 @@
 
 class LoadableTextTrack final : public TextTrack {
  public:
-  static LoadableTextTrack* Create(HTMLTrackElement* track) {
-    return MakeGarbageCollected<LoadableTextTrack>(track);
-  }
-
   explicit LoadableTextTrack(HTMLTrackElement*);
   ~LoadableTextTrack() override;
 
diff --git a/third_party/blink/renderer/core/html/track/text_track.cc b/third_party/blink/renderer/core/html/track/text_track.cc
index 6bc0fe0..d2cb695e 100644
--- a/third_party/blink/renderer/core/html/track/text_track.cc
+++ b/third_party/blink/renderer/core/html/track/text_track.cc
@@ -204,7 +204,7 @@
     return nullptr;
 
   if (!active_cues_) {
-    active_cues_ = TextTrackCueList::Create();
+    active_cues_ = MakeGarbageCollected<TextTrackCueList>();
   }
 
   cues_->CollectActiveCues(*active_cues_);
@@ -331,7 +331,7 @@
 
 TextTrackCueList* TextTrack::EnsureTextTrackCueList() {
   if (!cues_) {
-    cues_ = TextTrackCueList::Create();
+    cues_ = MakeGarbageCollected<TextTrackCueList>();
   }
 
   return cues_.Get();
diff --git a/third_party/blink/renderer/core/html/track/text_track_cue_list.h b/third_party/blink/renderer/core/html/track/text_track_cue_list.h
index 125d21a..261bce3 100644
--- a/third_party/blink/renderer/core/html/track/text_track_cue_list.h
+++ b/third_party/blink/renderer/core/html/track/text_track_cue_list.h
@@ -37,10 +37,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static TextTrackCueList* Create() {
-    return MakeGarbageCollected<TextTrackCueList>();
-  }
-
   TextTrackCueList();
 
   wtf_size_t length() const;
diff --git a/third_party/blink/renderer/core/html/track/text_track_list.h b/third_party/blink/renderer/core/html/track/text_track_list.h
index 841e0d88..f4a17ff 100644
--- a/third_party/blink/renderer/core/html/track/text_track_list.h
+++ b/third_party/blink/renderer/core/html/track/text_track_list.h
@@ -42,10 +42,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static TextTrackList* Create(HTMLMediaElement* owner) {
-    return MakeGarbageCollected<TextTrackList>(owner);
-  }
-
   explicit TextTrackList(HTMLMediaElement*);
   ~TextTrackList() override;
 
diff --git a/third_party/blink/renderer/core/html/track/text_track_list_test.cc b/third_party/blink/renderer/core/html/track/text_track_list_test.cc
index ea1c312..e389d3b 100644
--- a/third_party/blink/renderer/core/html/track/text_track_list_test.cc
+++ b/third_party/blink/renderer/core/html/track/text_track_list_test.cc
@@ -13,7 +13,7 @@
 
 TEST(TextTrackListTest, InvalidateTrackIndexes) {
   // Create and fill the list
-  TextTrackList* list = TextTrackList::Create(HTMLVideoElement::Create(
+  auto* list = MakeGarbageCollected<TextTrackList>(HTMLVideoElement::Create(
       std::make_unique<DummyPageHolder>()->GetDocument()));
   const size_t kNumTextTracks = 4;
   TextTrack* text_tracks[kNumTextTracks];
diff --git a/third_party/blink/renderer/core/html/track/video_track_list.cc b/third_party/blink/renderer/core/html/track/video_track_list.cc
index a84e34ad..0e002148 100644
--- a/third_party/blink/renderer/core/html/track/video_track_list.cc
+++ b/third_party/blink/renderer/core/html/track/video_track_list.cc
@@ -9,10 +9,6 @@
 
 namespace blink {
 
-VideoTrackList* VideoTrackList::Create(HTMLMediaElement& media_element) {
-  return MakeGarbageCollected<VideoTrackList>(media_element);
-}
-
 VideoTrackList::~VideoTrackList() = default;
 
 VideoTrackList::VideoTrackList(HTMLMediaElement& media_element)
diff --git a/third_party/blink/renderer/core/html/track/video_track_list.h b/third_party/blink/renderer/core/html/track/video_track_list.h
index 96c14cfc..4fee375 100644
--- a/third_party/blink/renderer/core/html/track/video_track_list.h
+++ b/third_party/blink/renderer/core/html/track/video_track_list.h
@@ -14,8 +14,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static VideoTrackList* Create(HTMLMediaElement&);
-
   explicit VideoTrackList(HTMLMediaElement&);
   ~VideoTrackList() override;
 
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 80d1e199..ebba576 100644
--- a/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
+++ b/third_party/blink/renderer/core/imagebitmap/image_bitmap_test.cc
@@ -106,8 +106,8 @@
 
 TEST_F(ImageBitmapTest, ImageResourceConsistency) {
   const ImageBitmapOptions* default_options = ImageBitmapOptions::Create();
-  HTMLImageElement* image_element =
-      HTMLImageElement::Create(*Document::CreateForTest());
+  auto* image_element =
+      MakeGarbageCollected<HTMLImageElement>(*Document::CreateForTest());
   sk_sp<SkColorSpace> src_rgb_color_space = SkColorSpace::MakeSRGB();
   SkImageInfo raster_image_info =
       SkImageInfo::MakeN32Premul(5, 5, src_rgb_color_space);
@@ -177,8 +177,8 @@
 // Verifies that ImageBitmaps constructed from HTMLImageElements hold a
 // reference to the original Image if the HTMLImageElement src is changed.
 TEST_F(ImageBitmapTest, ImageBitmapSourceChanged) {
-  HTMLImageElement* image =
-      HTMLImageElement::Create(*Document::CreateForTest());
+  auto* image =
+      MakeGarbageCollected<HTMLImageElement>(*Document::CreateForTest());
   sk_sp<SkColorSpace> src_rgb_color_space = SkColorSpace::MakeSRGB();
   SkImageInfo raster_image_info =
       SkImageInfo::MakeN32Premul(5, 5, src_rgb_color_space);
@@ -316,8 +316,8 @@
 }
 
 TEST_F(ImageBitmapTest, ImageBitmapColorSpaceConversionHTMLImageElement) {
-  HTMLImageElement* image_element =
-      HTMLImageElement::Create(*Document::CreateForTest());
+  auto* image_element =
+      MakeGarbageCollected<HTMLImageElement>(*Document::CreateForTest());
 
   SkPaint p;
   p.setColor(SK_ColorRED);
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
index 9dc7f4d..8d7a7580 100644
--- a/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/pointer_event_manager_test.cc
@@ -18,10 +18,6 @@
 namespace {
 class CheckPointerEventListenerCallback final : public NativeEventListener {
  public:
-  static CheckPointerEventListenerCallback* Create() {
-    return MakeGarbageCollected<CheckPointerEventListenerCallback>();
-  }
-
   void Invoke(ExecutionContext*, Event* event) override {
     const String pointer_type = ((PointerEvent*)event)->pointerType();
     if (pointer_type == "mouse")
@@ -159,8 +155,7 @@
       "<body style='padding: 0px; width: 400px; height: 400px;'>"
       "<div draggable='true' style='width: 150px; height: 150px;'></div>"
       "</body>");
-  CheckPointerEventListenerCallback* callback =
-      CheckPointerEventListenerCallback::Create();
+  auto* callback = MakeGarbageCollected<CheckPointerEventListenerCallback>();
   GetDocument().body()->addEventListener(event_type_names::kPointercancel,
                                          callback);
 
diff --git a/third_party/blink/renderer/core/input/touch_event_manager.cc b/third_party/blink/renderer/core/input/touch_event_manager.cc
index e9536645..a6fde8d 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager.cc
@@ -215,10 +215,10 @@
       FloatSize(transformed_event.width / 2.f, transformed_event.height / 2.f)
           .ScaledBy(scale_factor);
 
-  return Touch::Create(target_frame, touch_node, point_attr->event_.id,
-                       transformed_event.PositionInScreen(), document_point,
-                       adjusted_radius, transformed_event.rotation_angle,
-                       transformed_event.force, region_id);
+  return MakeGarbageCollected<Touch>(
+      target_frame, touch_node, point_attr->event_.id,
+      transformed_event.PositionInScreen(), document_point, adjusted_radius,
+      transformed_event.rotation_angle, transformed_event.force, region_id);
 }
 
 WebCoalescedInputEvent TouchEventManager::GenerateWebCoalescedInputEvent() {
diff --git a/third_party/blink/renderer/core/input/touch_event_manager_test.cc b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
index 0d128ef..b51e469 100644
--- a/third_party/blink/renderer/core/input/touch_event_manager_test.cc
+++ b/third_party/blink/renderer/core/input/touch_event_manager_test.cc
@@ -37,10 +37,6 @@
 
 class CheckEventListenerCallback final : public NativeEventListener {
  public:
-  static CheckEventListenerCallback* Create() {
-    return MakeGarbageCollected<CheckEventListenerCallback>();
-  }
-
   void Invoke(ExecutionContext*, Event* event) override {
     event_received_ = true;
   }
@@ -60,7 +56,7 @@
     <iframe id='target' style='width: 200px; height: 200px;'></iframe>
     </body>
   )HTML");
-  CheckEventListenerCallback* callback = CheckEventListenerCallback::Create();
+  auto* callback = MakeGarbageCollected<CheckEventListenerCallback>();
   GetDocument().body()->addEventListener(event_type_names::kTouchstart,
                                          callback);
 
diff --git a/third_party/blink/renderer/core/inspector/dev_tools_emulator.cc b/third_party/blink/renderer/core/inspector/dev_tools_emulator.cc
index 071b2e7..2eefbc9 100644
--- a/third_party/blink/renderer/core/inspector/dev_tools_emulator.cc
+++ b/third_party/blink/renderer/core/inspector/dev_tools_emulator.cc
@@ -109,10 +109,6 @@
 
 DevToolsEmulator::~DevToolsEmulator() = default;
 
-DevToolsEmulator* DevToolsEmulator::Create(WebViewImpl* web_view_base) {
-  return MakeGarbageCollected<DevToolsEmulator>(web_view_base);
-}
-
 void DevToolsEmulator::Trace(blink::Visitor* visitor) {}
 
 void DevToolsEmulator::SetTextAutosizingEnabled(bool enabled) {
diff --git a/third_party/blink/renderer/core/inspector/dev_tools_emulator.h b/third_party/blink/renderer/core/inspector/dev_tools_emulator.h
index 61138fea..7ed7111 100644
--- a/third_party/blink/renderer/core/inspector/dev_tools_emulator.h
+++ b/third_party/blink/renderer/core/inspector/dev_tools_emulator.h
@@ -26,7 +26,6 @@
  public:
   explicit DevToolsEmulator(WebViewImpl*);
   ~DevToolsEmulator();
-  static DevToolsEmulator* Create(WebViewImpl*);
   void Trace(blink::Visitor*);
 
   // Settings overrides.
diff --git a/third_party/blink/renderer/core/inspector/dev_tools_host.cc b/third_party/blink/renderer/core/inspector/dev_tools_host.cc
index 1e519a01..01da92a 100644
--- a/third_party/blink/renderer/core/inspector/dev_tools_host.cc
+++ b/third_party/blink/renderer/core/inspector/dev_tools_host.cc
@@ -62,12 +62,6 @@
 
 class FrontendMenuProvider final : public ContextMenuProvider {
  public:
-  static FrontendMenuProvider* Create(DevToolsHost* devtools_host,
-                                      WebVector<WebMenuItemInfo> items) {
-    return MakeGarbageCollected<FrontendMenuProvider>(devtools_host,
-                                                      std::move(items));
-  }
-
   FrontendMenuProvider(DevToolsHost* devtools_host,
                        WebVector<WebMenuItemInfo> items)
       : devtools_host_(devtools_host), items_(std::move(items)) {}
@@ -202,8 +196,8 @@
                                    float y,
                                    WebVector<WebMenuItemInfo> items) {
   DCHECK(frontend_frame_);
-  FrontendMenuProvider* menu_provider =
-      FrontendMenuProvider::Create(this, std::move(items));
+  auto* menu_provider =
+      MakeGarbageCollected<FrontendMenuProvider>(this, std::move(items));
   menu_provider_ = menu_provider;
   float zoom = target_frame->PageZoomFactor();
   {
diff --git a/third_party/blink/renderer/core/inspector/dev_tools_host.h b/third_party/blink/renderer/core/inspector/dev_tools_host.h
index 8f35f29..276e812 100644
--- a/third_party/blink/renderer/core/inspector/dev_tools_host.h
+++ b/third_party/blink/renderer/core/inspector/dev_tools_host.h
@@ -46,11 +46,6 @@
   DEFINE_WRAPPERTYPEINFO();
 
  public:
-  static DevToolsHost* Create(InspectorFrontendClient* client,
-                              LocalFrame* frontend_frame) {
-    return MakeGarbageCollected<DevToolsHost>(client, frontend_frame);
-  }
-
   DevToolsHost(InspectorFrontendClient*, LocalFrame* frontend_frame);
   ~DevToolsHost() override;
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
index e613378..f233354 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.cc
@@ -2057,7 +2057,7 @@
   if (!mutable_attribute_style)
     return nullptr;
 
-  InspectorStyle* inspector_style = InspectorStyle::Create(
+  InspectorStyle* inspector_style = MakeGarbageCollected<InspectorStyle>(
       mutable_attribute_style->EnsureCSSStyleDeclaration(), nullptr, nullptr);
   return inspector_style->BuildObjectForStyle();
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_css_agent.h b/third_party/blink/renderer/core/inspector/inspector_css_agent.h
index 0eab0289..e6f84f0 100644
--- a/third_party/blink/renderer/core/inspector/inspector_css_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_css_agent.h
@@ -95,17 +95,6 @@
   static CSSStyleRule* AsCSSStyleRule(CSSRule*);
   static CSSMediaRule* AsCSSMediaRule(CSSRule*);
 
-  static InspectorCSSAgent* Create(
-      InspectorDOMAgent* dom_agent,
-      InspectedFrames* inspected_frames,
-      InspectorNetworkAgent* network_agent,
-      InspectorResourceContentLoader* resource_content_loader,
-      InspectorResourceContainer* resource_container) {
-    return MakeGarbageCollected<InspectorCSSAgent>(
-        dom_agent, inspected_frames, network_agent, resource_content_loader,
-        resource_container);
-  }
-
   static void CollectAllDocumentStyleSheets(Document*,
                                             HeapVector<Member<CSSStyleSheet>>&);
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h
index 5229321..93afdc46 100644
--- a/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_layer_tree_agent.h
@@ -57,12 +57,6 @@
     virtual bool IsInspectorLayer(const cc::Layer*) = 0;
   };
 
-  static InspectorLayerTreeAgent* Create(InspectedFrames* inspected_frames,
-                                         Client* client) {
-    return MakeGarbageCollected<InspectorLayerTreeAgent>(inspected_frames,
-                                                         client);
-  }
-
   InspectorLayerTreeAgent(InspectedFrames*, Client*);
   ~InspectorLayerTreeAgent() override;
   void Trace(blink::Visitor*) override;
diff --git a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
index 5840a02..483e89f 100644
--- a/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_overlay_agent.cc
@@ -282,11 +282,6 @@
 class InspectorOverlayAgent::InspectorOverlayChromeClient final
     : public EmptyChromeClient {
  public:
-  static InspectorOverlayChromeClient* Create(ChromeClient& client,
-                                              InspectorOverlayAgent& overlay) {
-    return MakeGarbageCollected<InspectorOverlayChromeClient>(client, overlay);
-  }
-
   InspectorOverlayChromeClient(ChromeClient& client,
                                InspectorOverlayAgent& overlay)
       : client_(&client), overlay_(&overlay) {}
@@ -824,7 +819,7 @@
   Page::PageClients page_clients;
   FillWithEmptyClients(page_clients);
   DCHECK(!overlay_chrome_client_);
-  overlay_chrome_client_ = InspectorOverlayChromeClient::Create(
+  overlay_chrome_client_ = MakeGarbageCollected<InspectorOverlayChromeClient>(
       GetFrame()->GetPage()->GetChromeClient(), *this);
   page_clients.chrome_client = overlay_chrome_client_.Get();
   overlay_page_ = Page::CreateNonOrdinary(page_clients);
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
index 673545e1..fd0800fe 100644
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
@@ -363,15 +363,6 @@
   }
 }
 
-InspectorPageAgent* InspectorPageAgent::Create(
-    InspectedFrames* inspected_frames,
-    Client* client,
-    InspectorResourceContentLoader* resource_content_loader,
-    v8_inspector::V8InspectorSession* v8_session) {
-  return MakeGarbageCollected<InspectorPageAgent>(
-      inspected_frames, client, resource_content_loader, v8_session);
-}
-
 String InspectorPageAgent::ResourceTypeJson(
     InspectorPageAgent::ResourceType resource_type) {
   switch (resource_type) {
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.h b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
index 543f6ba..79d30c96 100644
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
@@ -88,11 +88,6 @@
     kOtherResource
   };
 
-  static InspectorPageAgent* Create(InspectedFrames*,
-                                    Client*,
-                                    InspectorResourceContentLoader*,
-                                    v8_inspector::V8InspectorSession*);
-
   static HeapVector<Member<Document>> ImportsForFrame(LocalFrame*);
   static bool CachedResourceContent(Resource*,
                                     String* result,
diff --git a/third_party/blink/renderer/core/inspector/inspector_performance_agent.h b/third_party/blink/renderer/core/inspector/inspector_performance_agent.h
index eb54c6b..9202700 100644
--- a/third_party/blink/renderer/core/inspector/inspector_performance_agent.h
+++ b/third_party/blink/renderer/core/inspector/inspector_performance_agent.h
@@ -32,10 +32,6 @@
  public:
   void Trace(blink::Visitor*) override;
 
-  static InspectorPerformanceAgent* Create(InspectedFrames* inspected_frames) {
-    return MakeGarbageCollected<InspectorPerformanceAgent>(inspected_frames);
-  }
-
   explicit InspectorPerformanceAgent(InspectedFrames*);
   ~InspectorPerformanceAgent() override;
 
diff --git a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h
index b1f8728..33fc7e6 100644
--- a/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h
+++ b/third_party/blink/renderer/core/inspector/inspector_resource_content_loader.h
@@ -22,10 +22,6 @@
 class CORE_EXPORT InspectorResourceContentLoader final
     : public GarbageCollectedFinalized<InspectorResourceContentLoader> {
  public:
-  static InspectorResourceContentLoader* Create(LocalFrame* inspected_frame) {
-    return MakeGarbageCollected<InspectorResourceContentLoader>(
-        inspected_frame);
-  }
   explicit InspectorResourceContentLoader(LocalFrame*);
   ~InspectorResourceContentLoader();
   void Dispose();
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
index 48e3f5f..a4a5ba9 100644
--- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
+++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.cc
@@ -720,14 +720,6 @@
   return result;
 }
 
-InspectorStyle* InspectorStyle::Create(
-    CSSStyleDeclaration* style,
-    CSSRuleSourceData* source_data,
-    InspectorStyleSheetBase* parent_style_sheet) {
-  return MakeGarbageCollected<InspectorStyle>(style, source_data,
-                                              parent_style_sheet);
-}
-
 InspectorStyle::InspectorStyle(CSSStyleDeclaration* style,
                                CSSRuleSourceData* source_data,
                                InspectorStyleSheetBase* parent_style_sheet)
@@ -1649,7 +1641,7 @@
 
 InspectorStyle* InspectorStyleSheet::GetInspectorStyle(
     CSSStyleDeclaration* style) {
-  return style ? InspectorStyle::Create(
+  return style ? MakeGarbageCollected<InspectorStyle>(
                      style, SourceDataForRule(style->parentRule()), this)
                : nullptr;
 }
@@ -1941,9 +1933,10 @@
 
 InspectorStyle* InspectorStyleSheetForInlineStyle::GetInspectorStyle(
     CSSStyleDeclaration* style) {
-  if (!inspector_style_)
-    inspector_style_ =
-        InspectorStyle::Create(element_->style(), RuleSourceData(), this);
+  if (!inspector_style_) {
+    inspector_style_ = MakeGarbageCollected<InspectorStyle>(
+        element_->style(), RuleSourceData(), this);
+  }
 
   return inspector_style_;
 }
diff --git a/third_party/blink/renderer/core/inspector/inspector_style_sheet.h b/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
index f72b15c..aab9353 100644
--- a/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
+++ b/third_party/blink/renderer/core/inspector/inspector_style_sheet.h
@@ -54,9 +54,6 @@
 
 class InspectorStyle final : public GarbageCollectedFinalized<InspectorStyle> {
  public:
-  static InspectorStyle* Create(CSSStyleDeclaration*,
-                                CSSRuleSourceData*,
-                                InspectorStyleSheetBase* parent_style_sheet);
   InspectorStyle(CSSStyleDeclaration*,
                  CSSRuleSourceData*,
                  InspectorStyleSheetBase* parent_style_sheet);
diff --git a/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc b/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
index 5ce1fa2..656d287 100644
--- a/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/flexible_box_algorithm.cc
@@ -312,6 +312,7 @@
 
 void FlexLine::ComputeLineItemsPosition(LayoutUnit main_axis_offset,
                                         LayoutUnit& cross_axis_offset) {
+  this->main_axis_offset = main_axis_offset;
   // Recalculate the remaining free space. The adjustment for flex factors
   // between 0..1 means we can't just use remainingFreeSpace here.
   remaining_free_space = container_main_inner_size;
@@ -326,8 +327,11 @@
 
   LayoutUnit auto_margin_offset = ApplyMainAxisAutoMarginAdjustment();
   const LayoutUnit available_free_space = remaining_free_space;
-  main_axis_offset += FlexLayoutAlgorithm::InitialContentPositionOffset(
-      available_free_space, justify_content, line_items.size());
+  LayoutUnit initial_position =
+      FlexLayoutAlgorithm::InitialContentPositionOffset(
+          available_free_space, justify_content, line_items.size());
+  main_axis_offset += initial_position;
+  sum_justify_adjustments += initial_position;
   LayoutUnit max_descent;  // Used when align-items: baseline.
   LayoutUnit max_child_cross_axis_extent;
   bool should_flip_main_axis = !algorithm->StyleRef().IsColumnFlexDirection() &&
@@ -373,9 +377,11 @@
 
     if (i != line_items.size() - 1) {
       // The last item does not get extra space added.
-      main_axis_offset +=
+      LayoutUnit space_between =
           FlexLayoutAlgorithm::ContentDistributionSpaceBetweenChildren(
               available_free_space, justify_content, line_items.size());
+      main_axis_offset += space_between;
+      sum_justify_adjustments += space_between;
     }
   }
 
@@ -490,6 +496,27 @@
          MainAxisOverflowForChild(child) == EOverflow::kVisible;
 }
 
+LayoutUnit FlexLayoutAlgorithm::IntrinsicContentBlockSize() const {
+  if (flex_lines_.IsEmpty())
+    return LayoutUnit();
+
+  if (IsColumnFlow()) {
+    LayoutUnit max_size;
+    for (const FlexLine& line : flex_lines_) {
+      // Subtract main_axis_offset to remove border/padding
+      max_size = std::max(line.main_axis_extent - line.sum_justify_adjustments -
+                              line.main_axis_offset,
+                          max_size);
+    }
+    return max_size;
+  }
+
+  const FlexLine& last_line = flex_lines_.back();
+  // Subtract the first line's offset to remove border/padding
+  return last_line.cross_axis_offset + last_line.cross_axis_extent -
+         flex_lines_.front().cross_axis_offset;
+}
+
 TransformedWritingMode FlexLayoutAlgorithm::GetTransformedWritingMode() const {
   return GetTransformedWritingMode(*style_);
 }
diff --git a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
index ad69b42..5646019 100644
--- a/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
+++ b/third_party/blink/renderer/core/layout/flexible_box_algorithm.h
@@ -251,12 +251,13 @@
   LayoutUnit initial_free_space;
   LayoutUnit remaining_free_space;
 
-  // These get filled in by ComputeLineItemsPosition (for now)
-  // TODO(cbiesinger): Move that to FlexibleBoxAlgorithm.
+  // These get filled in by ComputeLineItemsPosition
+  LayoutUnit main_axis_offset;
   LayoutUnit main_axis_extent;
   LayoutUnit cross_axis_offset;
   LayoutUnit cross_axis_extent;
   LayoutUnit max_ascent;
+  LayoutUnit sum_justify_adjustments;
 };
 
 // This class implements the CSS Flexbox layout algorithm:
@@ -313,6 +314,8 @@
 
   bool ShouldApplyMinSizeAutoForChild(const LayoutBox& child) const;
 
+  LayoutUnit IntrinsicContentBlockSize() const;
+
   static TransformedWritingMode GetTransformedWritingMode(const ComputedStyle&);
 
   static const StyleContentAlignmentData& ContentAlignmentNormalBehavior();
diff --git a/third_party/blink/renderer/core/layout/layout_block_flow.cc b/third_party/blink/renderer/core/layout/layout_block_flow.cc
index 327f645b..7520951 100644
--- a/third_party/blink/renderer/core/layout/layout_block_flow.cc
+++ b/third_party/blink/renderer/core/layout/layout_block_flow.cc
@@ -769,9 +769,11 @@
   if (LayoutFlowThread* flow_thread = FlowThreadContainingBlock())
     layout_info.RollBackToInitialMultiColumnLayoutState(*flow_thread);
 
+  LayoutUnit& previous_float_logical_bottom =
+      layout_info.PreviousFloatLogicalBottom();
+  LayoutUnit lowest_float =
+      std::max(previous_float_logical_bottom, LowestFloatLogicalBottom());
   if (child.IsLayoutBlockFlow()) {
-    LayoutUnit& previous_float_logical_bottom =
-        layout_info.PreviousFloatLogicalBottom();
     LayoutBlockFlow& child_block_flow = ToLayoutBlockFlow(child);
     if (child_block_flow.ContainsFloats() || ContainsFloats())
       MarkDescendantsWithFloatsForLayoutIfNeeded(
@@ -780,11 +782,16 @@
     // TODO(mstensho): A writing mode root is one thing, but we should be able
     // to skip anything that establishes a new block formatting context here.
     // Their floats don't affect us.
-    if (!child_block_flow.IsWritingModeRoot())
+    if (!child_block_flow.IsWritingModeRoot() &&
+        child_block_flow.ContainsFloats()) {
+      // Only do this if the child actually contains floats, so that we don't
+      // set previous_float_logical_bottom to child.LogicalTop() when there
+      // are none.
       previous_float_logical_bottom =
           std::max(previous_float_logical_bottom,
                    child_block_flow.LogicalTop() +
                        child_block_flow.LowestFloatLogicalBottom());
+    }
   }
 
   LayoutUnit old_logical_top = LogicalTopForChild(child);
@@ -792,7 +799,10 @@
 
   SubtreeLayoutScope layout_scope(child);
   if (!child.NeedsLayout()) {
-    if (new_logical_top != old_logical_top && child.ShrinkToAvoidFloats()) {
+    // Like in MarkDescendantsWithFloatsForLayoutIfNeeded, we only need
+    // to mark this object for layout if it actually is affected by a float
+    if (new_logical_top != old_logical_top && child.ShrinkToAvoidFloats() &&
+        (new_logical_top < lowest_float || old_logical_top < lowest_float)) {
       // The child's width is affected by adjacent floats. When the child shifts
       // to clear an item, its width can change (because it has more available
       // width).
diff --git a/third_party/blink/renderer/core/layout/layout_flexible_box.cc b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
index 87f97100..ab52ec5 100644
--- a/third_party/blink/renderer/core/layout/layout_flexible_box.cc
+++ b/third_party/blink/renderer/core/layout/layout_flexible_box.cc
@@ -918,6 +918,10 @@
   }
 
   UpdateLogicalHeight();
+  if (!HasOverrideLogicalHeight() && IsColumnFlow()) {
+    SetIntrinsicContentLogicalHeight(
+        flex_algorithm.IntrinsicContentBlockSize());
+  }
   RepositionLogicalHeightDependentFlexItems(flex_algorithm.FlexLines());
 }
 
diff --git a/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h b/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h
index e0a65b1a..b843953 100644
--- a/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h
+++ b/third_party/blink/renderer/core/layout/line/breaking_context_inline_headers.h
@@ -207,7 +207,7 @@
   bool ignoring_spaces_;
   bool current_character_is_space_;
   bool previous_character_is_space_;
-  bool single_leading_space_;
+  bool has_former_opportunity_;
   unsigned current_start_offset_;  // initial offset for the current text
   bool applied_start_width_;
   bool include_end_width_;
@@ -383,7 +383,7 @@
   // initial offset of the current handle text so that we can then identify
   // a single leading white-space as potential breaking opportunities.
   current_start_offset_ = current_.Offset();
-  single_leading_space_ = false;
+  has_former_opportunity_ = false;
 }
 
 inline void BreakingContext::Increment() {
@@ -842,7 +842,7 @@
   // If the first break opportunity doesn't fit, and if there's a break
   // opportunity in previous runs, break at the opportunity.
   if (!width_.FitsOnLine(width) &&
-      (width_.CommittedWidth() || single_leading_space_))
+      (width_.CommittedWidth() || has_former_opportunity_))
     return false;
   return RewindToMidWordBreak(word_measurement, end, width);
 }
@@ -1050,14 +1050,15 @@
     UChar c = current_.Current();
     SetCurrentCharacterIsSpace(c);
 
-    // Auto-wrapping text should not wrap in the middle of a word if it has
-    // an opportunity to break at a leading white-space.
-    // TODO (jfernandez): This change is questionable, but it's required to
-    // achieve the expected behavior for 'break-word' (cases 2.1 and 2.2), while
-    // keeping current behavior for 'break-all' (cases 4.1 and 4.2)
-    // https://github.com/w3c/csswg-drafts/issues/2907
-    if (single_leading_space_)
+    // A single preserved leading white-space doesn't fulfill the 'betweenWords'
+    // condition, however it's indeed a soft-breaking opportunty so we may want
+    // to avoid breaking in the middle of the word.
+    if (at_start_ && current_character_is_space_ &&
+        !previous_character_is_space_) {
+      has_former_opportunity_ = can_break_mid_word;
+      break_words = false;
       can_break_mid_word = break_all;
+    }
 
     if (!collapse_white_space_ || !current_character_is_space_) {
       line_info_.SetEmpty(false);
@@ -1236,6 +1237,7 @@
       width_from_last_breaking_opportunity = 0;
       line_break_.MoveTo(current_.GetLineLayoutItem(), current_.Offset(),
                          current_.NextBreakablePosition());
+      has_former_opportunity_ = can_break_mid_word;
       break_words = false;
       can_break_mid_word = break_all;
       width_measurement_at_last_break_opportunity = last_width_measurement;
@@ -1365,8 +1367,6 @@
     if (auto_wrap_ && current_style_->BreakOnlyAfterWhiteSpace()) {
       line_break_.MoveTo(current_.GetLineLayoutItem(), current_.Offset(),
                          current_.NextBreakablePosition());
-      if (current_.Offset() == current_start_offset_ + 1)
-        single_leading_space_ = true;
     }
   }
   if (collapse_white_space_ && current_character_is_space_ && !ignoring_spaces_)
@@ -1423,7 +1423,7 @@
   DCHECK(curr_ws_ == EWhiteSpace::kBreakSpaces);
   // Avoid breaking before the first white-space after a word if there is a
   // breaking opportunity before.
-  if (single_leading_space_ && !previous_character_is_space_)
+  if (has_former_opportunity_)
     return;
 
   line_break_.MoveTo(current_.GetLineLayoutItem(), current_.Offset(),
diff --git a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
index 9fefcc0f..c6c7084 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_flex_layout_algorithm.cc
@@ -268,7 +268,9 @@
   container_builder_.SetInlineSize(border_box_size_.inline_size);
   container_builder_.SetBorders(borders_);
   container_builder_.SetPadding(padding_);
-  container_builder_.SetIntrinsicBlockSize(intrinsic_block_size);
+  container_builder_.SetIntrinsicBlockSize(
+      algorithm_->IntrinsicContentBlockSize() +
+      border_scrollbar_padding_.BlockSum());
 
   GiveLinesAndItemsFinalPositionAndSize();
 
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 6a83cf4..43ceb0c 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
@@ -507,11 +507,10 @@
     resource_length = static_cast<double>(GetImage()->Data()->size());
   }
 
-  // Calculate the image's compression ratio (in bytes per pixel) with both 1k
-  // and 10k overhead. The constant overhead allowance is provided to allow room
-  // for headers and to account for small images (which are harder to compress).
-  double compression_ratio_1k = (resource_length - 1024) / pixels;
-  double compression_ratio_10k = (resource_length - 10240) / pixels;
+  // Calculate the image's adjusted compression ratio (in bytes per pixel). A
+  // constant allowance (1024 bytes) is provided to allow room for headers and
+  // to account for small images (which are harder to compress).
+  double compression_ratio = (resource_length - 1024) / pixels;
 
   // Note that this approach may not always correctly identify the image (for
   // example, due to a misconfigured web server). This approach SHOULD work in
@@ -523,13 +522,7 @@
     // Enforce the lossy image policy.
     return context.IsFeatureEnabled(
         mojom::FeaturePolicyFeature::kUnoptimizedLossyImages,
-        PolicyValue(compression_ratio_1k), ReportOptions::kReportOnFailure);
-  }
-  if (MIMETypeRegistry::IsLosslessImageMIMEType(mime_type)) {
-    // Enforce the lossless image policy.
-    return context.IsFeatureEnabled(
-        mojom::FeaturePolicyFeature::kUnoptimizedLosslessImages,
-        PolicyValue(compression_ratio_10k), ReportOptions::kReportOnFailure);
+        PolicyValue(compression_ratio), ReportOptions::kReportOnFailure);
   }
 
   return true;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc
index 61dd224e..58f973b 100644
--- a/third_party/blink/renderer/core/page/chrome_client_impl.cc
+++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -587,8 +587,10 @@
     return nullptr;
 
   NotifyPopupOpeningObservers();
-  if (RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled())
-    return DateTimeChooserImpl::Create(this, picker_client, parameters);
+  if (RuntimeEnabledFeatures::InputMultipleFieldsUIEnabled()) {
+    return MakeGarbageCollected<DateTimeChooserImpl>(this, picker_client,
+                                                     parameters);
+  }
   return ExternalDateTimeChooser::Create(this, web_view_->Client(),
                                          picker_client, parameters);
 }
diff --git a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
index 0f389593..c6dae94d 100644
--- a/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
+++ b/third_party/blink/renderer/core/paint/image_paint_timing_detector_test.cc
@@ -287,7 +287,7 @@
     <div id="parent">
     </div>
   )HTML");
-  HTMLImageElement* image = HTMLImageElement::Create(GetDocument());
+  auto* image = MakeGarbageCollected<HTMLImageElement>(GetDocument());
   image->setAttribute("id", "target");
   GetDocument().getElementById("parent")->AppendChild(image);
   SetImageAndPaint("target", 5, 5);
diff --git a/third_party/blink/renderer/core/style/style_inherited_variables.h b/third_party/blink/renderer/core/style/style_inherited_variables.h
index 2c7613b..6c02a79 100644
--- a/third_party/blink/renderer/core/style/style_inherited_variables.h
+++ b/third_party/blink/renderer/core/style/style_inherited_variables.h
@@ -34,8 +34,7 @@
   void SetVariable(const AtomicString& name,
                    scoped_refptr<CSSVariableData> value) {
     needs_resolution_ =
-        needs_resolution_ || (value && (value->NeedsVariableResolution() ||
-                                        value->NeedsUrlResolution()));
+        needs_resolution_ || (value && value->NeedsVariableResolution());
     data_.Set(name, std::move(value));
   }
   CSSVariableData* GetVariable(const AtomicString& name) const;
diff --git a/third_party/blink/renderer/core/style/style_non_inherited_variables.h b/third_party/blink/renderer/core/style/style_non_inherited_variables.h
index 453d867d..d926bb08 100644
--- a/third_party/blink/renderer/core/style/style_non_inherited_variables.h
+++ b/third_party/blink/renderer/core/style/style_non_inherited_variables.h
@@ -38,8 +38,7 @@
   void SetVariable(const AtomicString& name,
                    scoped_refptr<CSSVariableData> value) {
     needs_resolution_ =
-        needs_resolution_ || (value && (value->NeedsVariableResolution() ||
-                                        value->NeedsUrlResolution()));
+        needs_resolution_ || (value && value->NeedsVariableResolution());
     data_.Set(name, std::move(value));
   }
   CSSVariableData* GetVariable(const AtomicString& name) const;
diff --git a/third_party/blink/renderer/core/workers/README.md b/third_party/blink/renderer/core/workers/README.md
index 34d0442..8e1d5616 100644
--- a/third_party/blink/renderer/core/workers/README.md
+++ b/third_party/blink/renderer/core/workers/README.md
@@ -81,4 +81,5 @@
 
 # References
 
+- [WorkerGlobalScope Initialization](https://docs.google.com/document/d/1JCv8TD2nPLNC2iRCp_D1OM4I3uTS0HoEobuTymaMqgw/edit?usp=sharing) (April 1, 2019)
 - [Worker / Worklet Internals](https://docs.google.com/presentation/d/1GZJ3VnLIO_Pw0jr9nRw6_-trg68ol-AkliMxJ6jo6Bo/edit?usp=sharing) (April 19, 2018)
diff --git a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
index 72b2df5..56ec9e41 100644
--- a/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
+++ b/third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc
@@ -1034,8 +1034,8 @@
       return;
     if (http_body && upload_) {
       upload_events = upload_->HasEventListeners();
-      upload_->DispatchEvent(
-          *ProgressEvent::Create(event_type_names::kLoadstart, false, 0, 0));
+      upload_->DispatchEvent(*ProgressEvent::Create(
+          event_type_names::kLoadstart, true, 0, http_body->SizeInBytes()));
       // See above.
       if (!send_flag_ || loader_)
         return;
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 4971b52..935eaf1 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
@@ -818,7 +818,7 @@
   ASSERT_EQ(ImageResourceContent::UpdateImageResult::kNoDecodeError,
             update_result);
 
-  HTMLImageElement* image_element = HTMLImageElement::Create(document);
+  auto* image_element = MakeGarbageCollected<HTMLImageElement>(document);
   image_element->SetImageForTest(resource_content);
 
   context->clearRect(0, 0, 2, 2);
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_writer.cc b/third_party/blink/renderer/modules/filesystem/file_system_writer.cc
index 18efa9c..91dfebd 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_writer.cc
+++ b/third_party/blink/renderer/modules/filesystem/file_system_writer.cc
@@ -7,6 +7,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_blob.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_readable_stream.h"
+#include "third_party/blink/renderer/bindings/modules/v8/blob_or_readable_stream.h"
 #include "third_party/blink/renderer/core/dom/dom_exception.h"
 #include "third_party/blink/renderer/core/fetch/fetch_data_loader.h"
 #include "third_party/blink/renderer/core/fetch/readable_stream_bytes_consumer.h"
@@ -24,20 +25,12 @@
 
 ScriptPromise FileSystemWriter::write(ScriptState* script_state,
                                       uint64_t position,
-                                      ScriptValue data,
+                                      const BlobOrReadableStream& data,
                                       ExceptionState& exception_state) {
-  v8::Isolate* isolate = script_state->GetIsolate();
-  if (V8Blob::HasInstance(data.V8Value(), isolate)) {
-    Blob* blob = V8Blob::ToImpl(data.V8Value().As<v8::Object>());
-    return WriteBlob(script_state, position, blob);
-  }
-  if (!V8ReadableStream::HasInstance(data.V8Value(), isolate)) {
-    if (!exception_state.HadException())
-      exception_state.ThrowTypeError("data should be a Blob or ReadableStream");
-    return ScriptPromise();
-  }
-  return WriteStream(script_state, position,
-                     V8ReadableStream::ToImpl(data.V8Value().As<v8::Object>()),
+  DCHECK(!data.IsNull());
+  if (data.IsBlob())
+    return WriteBlob(script_state, position, data.GetAsBlob());
+  return WriteStream(script_state, position, data.GetAsReadableStream(),
                      exception_state);
 }
 
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_writer.h b/third_party/blink/renderer/modules/filesystem/file_system_writer.h
index a0e417f..7adedcc9 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_writer.h
+++ b/third_party/blink/renderer/modules/filesystem/file_system_writer.h
@@ -12,13 +12,13 @@
 namespace blink {
 
 class Blob;
+class BlobOrReadableStream;
 class ExceptionState;
 class FetchDataLoader;
 class ReadableStream;
 class ScriptPromise;
 class ScriptPromiseResolver;
 class ScriptState;
-class ScriptValue;
 
 class FileSystemWriter final : public ScriptWrappable {
   DEFINE_WRAPPERTYPEINFO();
@@ -28,7 +28,7 @@
 
   ScriptPromise write(ScriptState*,
                       uint64_t position,
-                      ScriptValue data,
+                      const BlobOrReadableStream& data,
                       ExceptionState&);
   ScriptPromise truncate(ScriptState*, uint64_t size);
   ScriptPromise close(ScriptState*);
diff --git a/third_party/blink/renderer/modules/filesystem/file_system_writer.idl b/third_party/blink/renderer/modules/filesystem/file_system_writer.idl
index b1cf941..4c96379 100644
--- a/third_party/blink/renderer/modules/filesystem/file_system_writer.idl
+++ b/third_party/blink/renderer/modules/filesystem/file_system_writer.idl
@@ -7,9 +7,7 @@
     NoInterfaceObject,
     RuntimeEnabled=WritableFiles
 ] interface FileSystemWriter {
-    // TODO(mek): 'any' really is 'Blob or ReadableStream', but that's not
-    // currently supported by our bindings.
-    [CallWith=ScriptState, RaisesException] Promise<void> write(unsigned long long position, any data);
+    [CallWith=ScriptState, RaisesException] Promise<void> write(unsigned long long position, (Blob or ReadableStream) data);
     [CallWith=ScriptState] Promise<void> truncate(unsigned long long size);
 
     [CallWith=ScriptState] Promise<void> close();
diff --git a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
index 68a7ebc..7007591 100644
--- a/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
+++ b/third_party/blink/renderer/modules/media_controls/touchless/media_controls_touchless_impl_test.cc
@@ -63,7 +63,7 @@
     chrome_client_ = MakeGarbageCollected<MockChromeClientForTouchlessImpl>();
     clients.chrome_client = chrome_client_;
     SetupPageWithClients(
-        &clients, test::MediaStubLocalFrameClient::Create(
+        &clients, MakeGarbageCollected<test::MediaStubLocalFrameClient>(
                       std::make_unique<MockWebMediaPlayerForTouchlessImpl>()));
 
     GetDocument().write("<video>");
diff --git a/third_party/blink/renderer/modules/mediasource/source_buffer.cc b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
index e967f91..bae97df8 100644
--- a/third_party/blink/renderer/modules/mediasource/source_buffer.cc
+++ b/third_party/blink/renderer/modules/mediasource/source_buffer.cc
@@ -132,8 +132,10 @@
   DCHECK(web_source_buffer_);
   DCHECK(source_);
   DCHECK(source_->MediaElement());
-  audio_tracks_ = AudioTrackList::Create(*source_->MediaElement());
-  video_tracks_ = VideoTrackList::Create(*source_->MediaElement());
+  audio_tracks_ =
+      MakeGarbageCollected<AudioTrackList>(*source_->MediaElement());
+  video_tracks_ =
+      MakeGarbageCollected<VideoTrackList>(*source_->MediaElement());
   web_source_buffer_->SetClient(this);
 }
 
@@ -1072,8 +1074,8 @@
       const auto& kind = track_info.kind;
       // 5.3.7 TODO(servolk): Implement track kind processing.
       // 5.3.8.2 Let new video track be a new VideoTrack object.
-      VideoTrack* video_track =
-          VideoTrack::Create(track_info.id, kind, label, language, false);
+      auto* video_track = MakeGarbageCollected<VideoTrack>(
+          track_info.id, kind, label, language, false);
       SourceBufferTrackBaseSupplement::SetSourceBuffer(*video_track, this);
       // 5.3.8.7 If videoTracks.length equals 0, then run the following steps:
       if (videoTracks().length() == 0) {
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
index 1ab5b69f..40543ae 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -2012,7 +2012,7 @@
     ScriptPromise promise = resolver->Promise();
     peer_handler_->GetStats(
         std::make_unique<WebRTCStatsReportCallbackResolver>(resolver),
-        GetRTCStatsFilter(script_state));
+        GetExposedGroupIds(script_state));
 
     return promise;
   }
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
index d72e6ca..3de06b8 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver.cc
@@ -86,7 +86,7 @@
   ScriptPromise promise = resolver->Promise();
   receiver_->GetStats(
       std::make_unique<WebRTCStatsReportCallbackResolver>(resolver),
-      GetRTCStatsFilter(script_state));
+      GetExposedGroupIds(script_state));
   return promise;
 }
 
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 b0b204dd..bccaa30 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender.cc
@@ -456,7 +456,7 @@
   ScriptPromise promise = resolver->Promise();
   sender_->GetStats(
       std::make_unique<WebRTCStatsReportCallbackResolver>(resolver),
-      GetRTCStatsFilter(script_state));
+      GetExposedGroupIds(script_state));
   return promise;
 }
 
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 5d8b699..6c675b98 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.cc
@@ -9,6 +9,8 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 
+#include "third_party/webrtc/api/stats/rtc_stats.h"
+
 namespace blink {
 
 namespace {
@@ -117,14 +119,20 @@
 
 }  // namespace
 
-RTCStatsFilter GetRTCStatsFilter(const ScriptState* script_state) {
+std::vector<webrtc::NonStandardGroupId> GetExposedGroupIds(
+    const ScriptState* script_state) {
   const ExecutionContext* context = ExecutionContext::From(script_state);
   DCHECK(context->IsContextThread());
-  if (origin_trials::RtcAudioJitterBufferMaxPacketsEnabled(context) ||
-      origin_trials::RTCStatsRelativePacketArrivalDelayEnabled(context)) {
-    return RTCStatsFilter::kIncludeNonStandardMembers;
+  std::vector<webrtc::NonStandardGroupId> enabled_origin_trials;
+  if (origin_trials::RtcAudioJitterBufferMaxPacketsEnabled(context)) {
+    enabled_origin_trials.push_back(
+        webrtc::NonStandardGroupId::kRtcAudioJitterBufferMaxPackets);
   }
-  return RTCStatsFilter::kIncludeOnlyStandardMembers;
+  if (origin_trials::RTCStatsRelativePacketArrivalDelayEnabled(context)) {
+    enabled_origin_trials.push_back(
+        webrtc::NonStandardGroupId::kRtcStatsRelativePacketArrivalDelay);
+  }
+  return enabled_origin_trials;
 }
 
 RTCStatsReport::RTCStatsReport(std::unique_ptr<WebRTCStatsReport> report)
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h
index 1e4aa9d0b..59c219c6 100644
--- a/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h
+++ b/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.h
@@ -5,19 +5,22 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_STATS_REPORT_H_
 #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_STATS_REPORT_H_
 
+#include <map>
+#include <vector>
+
 #include "third_party/blink/public/platform/web_rtc_stats.h"
 #include "third_party/blink/renderer/bindings/core/v8/maplike.h"
 #include "third_party/blink/renderer/platform/bindings/script_wrappable.h"
 #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
 #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-#include <map>
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 
-// Determines if non-standardized members should be exposed based on if any
-// known WebRTC related Origin Trials are running.
-RTCStatsFilter GetRTCStatsFilter(const ScriptState* script_state);
+// Returns the group ids for non-standardized members which should be exposed
+// based on what Origin Trials are running.
+std::vector<webrtc::NonStandardGroupId> GetExposedGroupIds(
+    const ScriptState* script_state);
 
 // https://w3c.github.io/webrtc-pc/#rtcstatsreport-object
 class RTCStatsReport final : public ScriptWrappable,
diff --git a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
index 9dc8a3a..8e71100 100644
--- a/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
+++ b/third_party/blink/renderer/modules/service_worker/fetch_respond_with_observer.cc
@@ -215,8 +215,7 @@
 // JavaScript.
 void FetchRespondWithObserver::OnResponseRejected(
     ServiceWorkerResponseError error) {
-  // TODO(crbug.com/934622): Temporary CHECK for the crash bug.
-  CHECK(GetExecutionContext());
+  DCHECK(GetExecutionContext());
   GetExecutionContext()->AddConsoleMessage(
       ConsoleMessage::Create(mojom::ConsoleMessageSource::kJavaScript,
                              mojom::ConsoleMessageLevel::kWarning,
@@ -236,8 +235,7 @@
     ExceptionState::ContextType context_type,
     const char* interface_name,
     const char* property_name) {
-  // TODO(crbug.com/934622): Temporary CHECK for the crash bug.
-  CHECK(GetExecutionContext());
+  DCHECK(GetExecutionContext());
   if (!V8Response::HasInstance(value.V8Value(), value.GetIsolate())) {
     OnResponseRejected(ServiceWorkerResponseError::kNoV8Instance);
     return;
@@ -369,8 +367,7 @@
 }
 
 void FetchRespondWithObserver::OnNoResponse() {
-  // TODO(crbug.com/934622): Temporary CHECK for the crash bug.
-  CHECK(GetExecutionContext());
+  DCHECK(GetExecutionContext());
   ServiceWorkerGlobalScopeClient::From(GetExecutionContext())
       ->RespondToFetchEventWithNoResponse(event_id_, event_dispatch_time_,
                                           base::TimeTicks::Now());
diff --git a/third_party/blink/renderer/modules/service_worker/wait_until_observer.cc b/third_party/blink/renderer/modules/service_worker/wait_until_observer.cc
index 70b7133..c8ab772 100644
--- a/third_party/blink/renderer/modules/service_worker/wait_until_observer.cc
+++ b/third_party/blink/renderer/modules/service_worker/wait_until_observer.cc
@@ -111,8 +111,7 @@
 }
 
 void WaitUntilObserver::WillDispatchEvent() {
-  // TODO(crbug.com/934622): Temporary CHECK for the crash bug.
-  CHECK(GetExecutionContext());
+  DCHECK(GetExecutionContext());
 
   // When handling a notificationclick, paymentrequest, or backgroundfetchclick
   // event, we want to allow one window to be focused or opened. These calls are
diff --git a/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.cc b/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.cc
index 7906ee8..a75d4dd 100644
--- a/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.cc
+++ b/third_party/blink/renderer/platform/bindings/active_script_wrappable_base.cc
@@ -29,24 +29,22 @@
         header->IsInConstruction())
       continue;
 
+    // A wrapper isn't kept alive after its ExecutionContext becomes detached,
+    // even if |HasPendingActivity()| returns |true|. This measure avoids memory
+    // leaks and has proven not to be too eager wrt garbage collection of
+    // objects belonging to discarded browser contexts (
+    // https://html.spec.whatwg.org/C/#a-browsing-context-is-discarded )
+    //
+    // Consequently, an implementation of |HasPendingActivity()| is not required
+    // to take the detached state of the associated ExecutionContext into
+    // account (i.e., return |false|.) We probe the detached state of the
+    // ExecutionContext via |IsContextDestroyed()|.
+    if (active_wrappable->IsContextDestroyed())
+      continue;
+
     if (!active_wrappable->DispatchHasPendingActivity())
       continue;
 
-    // A wrapper isn't kept alive after its ExecutionContext becomes
-    // detached, even if hasPendingActivity() returns |true|. This measure
-    // avoids memory leaks and has proven not to be too eager wrt
-    // garbage collection of objects belonging to discarded browser contexts
-    // ( https://html.spec.whatwg.org/C/#a-browsing-context-is-discarded )
-    //
-    // Consequently, an implementation of hasPendingActivity() is
-    // not required to take the detached state of the associated
-    // ExecutionContext into account (i.e., return |false|.) We probe
-    // the detached state of the ExecutionContext via
-    // |isContextDestroyed()|.
-    //
-    // TODO(haraken): Implement correct lifetime using traceWrapper.
-    if (active_wrappable->IsContextDestroyed())
-      continue;
     ScriptWrappable* script_wrappable = active_wrappable->ToScriptWrappable();
     visitor->TraceWithWrappers(script_wrappable);
   }
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
index 2f41550..1660cc4 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.cc
@@ -168,13 +168,11 @@
   data->active_script_wrappables_.Clear();
 
   // Detach V8's garbage collector.
-  if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()) {
-    // Need to finalize an already running garbage collection as otherwise
-    // callbacks are missing and state gets out of sync.
-    ThreadState::Current()->FinishIncrementalMarkingIfRunning(
-        BlinkGC::kHeapPointersOnStack, BlinkGC::kAtomicMarking,
-        BlinkGC::kEagerSweeping, BlinkGC::GCReason::kThreadTerminationGC);
-  }
+  // Need to finalize an already running garbage collection as otherwise
+  // callbacks are missing and state gets out of sync.
+  ThreadState::Current()->FinishIncrementalMarkingIfRunning(
+      BlinkGC::kHeapPointersOnStack, BlinkGC::kAtomicMarking,
+      BlinkGC::kEagerSweeping, BlinkGC::GCReason::kThreadTerminationGC);
   isolate->SetEmbedderHeapTracer(nullptr);
   if (data->script_wrappable_visitor_->WrapperTracingInProgress())
     data->script_wrappable_visitor_->AbortTracingForTermination();
diff --git a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
index ff7d028..40fc3b5 100644
--- a/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
+++ b/third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h
@@ -219,11 +219,7 @@
   }
 
   v8::EmbedderHeapTracer* GetEmbedderHeapTracer() const {
-    return RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled()
-               ? static_cast<v8::EmbedderHeapTracer*>(
-                     GetUnifiedHeapController())
-               : static_cast<v8::EmbedderHeapTracer*>(
-                     GetScriptWrappableMarkingVisitor());
+    return static_cast<v8::EmbedderHeapTracer*>(GetUnifiedHeapController());
   }
 
  private:
diff --git a/third_party/blink/renderer/platform/exported/web_runtime_features.cc b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
index e5ec7e8f..63be399 100644
--- a/third_party/blink/renderer/platform/exported/web_runtime_features.cc
+++ b/third_party/blink/renderer/platform/exported/web_runtime_features.cc
@@ -39,10 +39,6 @@
   RuntimeEnabledFeatures::SetHeapIncrementalMarkingEnabled(enable);
 }
 
-void WebRuntimeFeatures::EnableBlinkHeapUnifiedGarbageCollection(bool enable) {
-  RuntimeEnabledFeatures::SetHeapUnifiedGarbageCollectionEnabled(enable);
-}
-
 void WebRuntimeFeatures::EnableBloatedRendererDetection(bool enable) {
   RuntimeEnabledFeatures::SetBloatedRendererDetectionEnabled(enable);
 }
diff --git a/third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h b/third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h
index 5a7af03..e28077f 100644
--- a/third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h
+++ b/third_party/blink/renderer/platform/graphics/test/fake_web_graphics_context_3d_provider.h
@@ -14,7 +14,7 @@
 #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h"
 #include "third_party/skia/include/core/SkRefCnt.h"
 #include "third_party/skia/include/gpu/GrContext.h"
-#include "third_party/skia/include/gpu/gl/GrGLInterface.h"
+#include "third_party/skia/include/gpu/mock/GrMockTypes.h"
 
 namespace blink {
 
@@ -24,8 +24,10 @@
                                    cc::ImageDecodeCache* cache = nullptr)
       : gl_(gl),
         image_decode_cache_(cache ? cache : &stub_image_decode_cache_) {
-    sk_sp<const GrGLInterface> gl_interface(GrGLCreateNullInterface());
-    gr_context_ = GrContext::MakeGL(std::move(gl_interface));
+    GrMockOptions mockOptions;
+    mockOptions.fConfigOptions[kBGRA_8888_GrPixelConfig] =
+        mockOptions.fConfigOptions[kRGBA_8888_GrPixelConfig];
+    gr_context_ = GrContext::MakeMock(&mockOptions);
     // enable all gpu features.
     for (unsigned feature = 0; feature < gpu::NUMBER_OF_GPU_FEATURE_TYPES;
          ++feature) {
diff --git a/third_party/blink/renderer/platform/heap/thread_state.cc b/third_party/blink/renderer/platform/heap/thread_state.cc
index 3843ff4f..10bc122 100644
--- a/third_party/blink/renderer/platform/heap/thread_state.cc
+++ b/third_party/blink/renderer/platform/heap/thread_state.cc
@@ -522,19 +522,10 @@
   if (gc_type == BlinkGC::kV8MajorGC) {
     // In case of unified heap garbage collections a V8 major GC also collects
     // the Blink heap.
-    if (RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled())
-      return;
-
-    // This CompleteSweep() will do nothing in common cases since we've
-    // called CompleteSweep() before V8 starts minor/major GCs.
-    // TODO(ulan): Try removing this for Major V8 GC too.
-    CompleteSweep();
-    DCHECK(!IsSweepingInProgress());
-    DCHECK(!SweepForbidden());
+    return;
   }
 
-  if ((gc_type == BlinkGC::kV8MajorGC && ShouldForceMemoryPressureGC()) ||
-      ShouldScheduleV8FollowupGC()) {
+  if (ShouldScheduleV8FollowupGC()) {
     // When we want to optimize for load time, we should prioritize throughput
     // over latency and not do incremental marking.
     if (RuntimeEnabledFeatures::HeapIncrementalMarkingEnabled() &&
@@ -548,10 +539,6 @@
               << "ScheduleV8FollowupGCIfNeeded: Scheduled precise GC";
       SchedulePreciseGC();
     }
-  } else if (gc_type == BlinkGC::kV8MajorGC && ShouldScheduleIdleGC()) {
-    VLOG(2) << "[state:" << this << "] "
-            << "ScheduleV8FollowupGCIfNeeded: Scheduled idle GC";
-    ScheduleIdleGC();
   }
 }
 
@@ -663,14 +650,6 @@
     }
   }
 
-  if (!RuntimeEnabledFeatures::HeapUnifiedGarbageCollectionEnabled() &&
-      ShouldScheduleIdleGC()) {
-    VLOG(2) << "[state:" << this << "] "
-            << "ScheduleGCIfNeeded: Scheduled idle GC";
-    ScheduleIdleGC();
-    return;
-  }
-
   if (GetGCState() == kNoGCScheduled &&
       RuntimeEnabledFeatures::HeapIncrementalMarkingStressEnabled()) {
     VLOG(2) << "[state:" << this << "] "
diff --git a/third_party/blink/renderer/platform/network/encoded_form_data.h b/third_party/blink/renderer/platform/network/encoded_form_data.h
index 586a06c..ed70d32 100644
--- a/third_party/blink/renderer/platform/network/encoded_form_data.h
+++ b/third_party/blink/renderer/platform/network/encoded_form_data.h
@@ -20,6 +20,8 @@
 #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_NETWORK_ENCODED_FORM_DATA_H_
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_NETWORK_ENCODED_FORM_DATA_H_
 
+#include <utility>
+
 #include "third_party/blink/renderer/platform/blob/blob_data.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/allocator.h"
@@ -29,6 +31,7 @@
 #include "third_party/blink/renderer/platform/wtf/vector.h"
 
 #include "services/network/public/mojom/data_pipe_getter.mojom-blink.h"
+#include "services/network/public/mojom/url_loader.mojom-blink.h"
 
 namespace blink {
 
@@ -178,6 +181,8 @@
   bool IsSafeToSendToAnotherThread() const;
 
  private:
+  friend struct mojo::StructTraits<network::mojom::URLRequestBodyDataView,
+                                   scoped_refptr<blink::EncodedFormData>>;
   EncodedFormData();
   EncodedFormData(const EncodedFormData&);
 
@@ -198,4 +203,4 @@
 
 }  // namespace blink
 
-#endif
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_NETWORK_ENCODED_FORM_DATA_H_
diff --git a/third_party/blink/renderer/platform/network/encoded_form_data.typemap b/third_party/blink/renderer/platform/network/encoded_form_data.typemap
index 8e0e849..c610628 100644
--- a/third_party/blink/renderer/platform/network/encoded_form_data.typemap
+++ b/third_party/blink/renderer/platform/network/encoded_form_data.typemap
@@ -6,5 +6,8 @@
 public_headers =
     [ "//third_party/blink/renderer/platform/network/encoded_form_data.h" ]
 traits_headers = [ "//third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h" ]
-type_mappings =
-    [ "network.mojom.DataElement = blink::FormDataElement[move_only]" ]
+
+type_mappings = [
+  "network.mojom.DataElement = blink::FormDataElement[move_only]",
+  "network.mojom.URLRequestBody = scoped_refptr<blink::EncodedFormData>[nullable_is_same_type,copyable_pass_by_value]",
+]
diff --git a/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.cc b/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.cc
index f66e122..d449da74 100644
--- a/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.cc
+++ b/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.cc
@@ -112,7 +112,7 @@
   switch (data_type) {
     case network::mojom::DataElementType::kBytes: {
       out->type_ = blink::FormDataElement::kData;
-      // TODO:(richard.li) Delete this workaround when type of
+      // TODO(richard.li): Delete this workaround when type of
       // blink::FormDataElement::data_ is changed to WTF::Vector<uint8_t>
       WTF::Vector<uint8_t> buf;
       if (!data.ReadBuf(&buf)) {
@@ -163,4 +163,19 @@
   return true;
 }
 
+// static
+bool StructTraits<network::mojom::URLRequestBodyDataView,
+                  scoped_refptr<blink::EncodedFormData>>::
+    Read(network::mojom::URLRequestBodyDataView in,
+         scoped_refptr<blink::EncodedFormData>* out) {
+  *out = blink::EncodedFormData::Create();
+  if (!in.ReadElements(&((*out)->elements_))) {
+    return false;
+  }
+  (*out)->identifier_ = in.identifier();
+  (*out)->contains_password_data_ = in.contains_sensitive_info();
+
+  return true;
+}
+
 }  // namespace mojo
diff --git a/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h b/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h
index 313a8d43..b5b376e 100644
--- a/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h
+++ b/third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h
@@ -55,6 +55,25 @@
                    blink::FormDataElement* out);
 };
 
+template <>
+struct PLATFORM_EXPORT StructTraits<network::mojom::URLRequestBodyDataView,
+                                    scoped_refptr<blink::EncodedFormData>> {
+  static const WTF::Vector<blink::FormDataElement>& elements(
+      const scoped_refptr<blink::EncodedFormData>& data) {
+    return data->elements_;
+  }
+  static int64_t identifier(const scoped_refptr<blink::EncodedFormData>& data) {
+    return data->identifier_;
+  }
+  static bool contains_sensitive_info(
+      const scoped_refptr<blink::EncodedFormData>& data) {
+    return data->contains_password_data_;
+  }
+
+  static bool Read(network::mojom::URLRequestBodyDataView in,
+                   scoped_refptr<blink::EncodedFormData>* out);
+};
+
 }  // namespace mojo
 
 #endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_NETWORK_ENCODED_FORM_DATA_MOJOM_TRAITS_H_
diff --git a/third_party/blink/renderer/platform/network/encoded_form_data_test.cc b/third_party/blink/renderer/platform/network/encoded_form_data_test.cc
index 5619caa..ba3e7e1 100644
--- a/third_party/blink/renderer/platform/network/encoded_form_data_test.cc
+++ b/third_party/blink/renderer/platform/network/encoded_form_data_test.cc
@@ -2,18 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h"
+#include <utility>
 
 #include "base/sequenced_task_runner.h"
 #include "base/test/scoped_task_environment.h"
 #include "mojo/public/cpp/base/file_mojom_traits.h"
 #include "mojo/public/cpp/base/file_path_mojom_traits.h"
 #include "mojo/public/cpp/base/time_mojom_traits.h"
+#include "mojo/public/cpp/bindings/array_traits_wtf_vector.h"
 #include "mojo/public/cpp/bindings/string_traits_wtf.h"
 #include "mojo/public/cpp/test_support/test_utils.h"
 #include "services/network/public/mojom/url_loader.mojom-blink.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom-blink.h"
 #include "third_party/blink/renderer/platform/network/encoded_form_data.h"
+#include "third_party/blink/renderer/platform/network/encoded_form_data_mojom_traits.h"
 
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -43,6 +45,11 @@
   }
 };
 
+class EncodedFormDataMojomTraitsTest : public testing::Test {
+ protected:
+  base::test::ScopedTaskEnvironment scoped_task_environment_;
+};
+
 TEST_F(EncodedFormDataTest, DeepCopy) {
   scoped_refptr<EncodedFormData> original(EncodedFormData::Create());
   original->AppendData("Foo", 3);
@@ -105,9 +112,7 @@
   }
 }
 
-TEST(EncodedFormDataMojomTraitsTest, Roundtrips_FormDataElement) {
-  base::test::ScopedTaskEnvironment scoped_task_environment_;
-
+TEST_F(EncodedFormDataMojomTraitsTest, Roundtrips_FormDataElement) {
   FormDataElement original1;
   original1.type_ = blink::FormDataElement::kData;
   original1.data_ = {'a', 'b', 'c', 'd'};
@@ -162,5 +167,16 @@
   EXPECT_TRUE(copied4.data_pipe_getter_);
 }
 
+TEST_F(EncodedFormDataMojomTraitsTest, Roundtrips_EncodedFormData) {
+  scoped_refptr<EncodedFormData> original1 = EncodedFormData::Create();
+  original1->SetIdentifier(1);
+  original1->SetContainsPasswordData(true);
+  scoped_refptr<EncodedFormData> copied1 = EncodedFormData::Create();
+  EXPECT_TRUE(mojo::test::SerializeAndDeserialize<
+              network::mojom::blink::URLRequestBody>(&original1, &copied1));
+  EXPECT_EQ(original1->Identifier(), copied1->Identifier());
+  EXPECT_EQ(original1->ContainsPasswordData(), copied1->ContainsPasswordData());
+}
+
 }  // namespace
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/network/mime/mime_type_registry.cc b/third_party/blink/renderer/platform/network/mime/mime_type_registry.cc
index 67b20abd..efd52daa 100644
--- a/third_party/blink/renderer/platform/network/mime/mime_type_registry.cc
+++ b/third_party/blink/renderer/platform/network/mime/mime_type_registry.cc
@@ -211,13 +211,4 @@
          EqualIgnoringASCIICase(mime_type, "image/pjpeg");
 }
 
-bool MIMETypeRegistry::IsLosslessImageMIMEType(const String& mime_type) {
-  return EqualIgnoringASCIICase(mime_type, "image/bmp") ||
-         EqualIgnoringASCIICase(mime_type, "image/gif") ||
-         EqualIgnoringASCIICase(mime_type, "image/png") ||
-         EqualIgnoringASCIICase(mime_type, "image/webp") ||
-         EqualIgnoringASCIICase(mime_type, "image/x-xbitmap") ||
-         EqualIgnoringASCIICase(mime_type, "image/x-png");
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/network/mime/mime_type_registry.h b/third_party/blink/renderer/platform/network/mime/mime_type_registry.h
index 6d10852c..8b54b9f 100644
--- a/third_party/blink/renderer/platform/network/mime/mime_type_registry.h
+++ b/third_party/blink/renderer/platform/network/mime/mime_type_registry.h
@@ -108,11 +108,6 @@
   // size will be restricted via the 'unoptimized-lossy-images' feature
   // policy. (JPEG)
   static bool IsLossyImageMIMEType(const String& mime_type);
-
-  // Checks to see if a mime type is an image type with lossless (or no)
-  // compression, whose size may be restricted via the
-  // 'unoptimized-lossless-images' feature policy. (BMP, GIF, PNG, WEBP)
-  static bool IsLosslessImageMIMEType(const String& mime_type);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 73297d36..48c5380 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -623,10 +623,6 @@
       name: "HeapIncrementalMarkingStress"
     },
     {
-      name: "HeapUnifiedGarbageCollection",
-      status: "stable",
-    },
-    {
       name: "HrefTranslate",
       depends_on: ["TranslateService"],
       origin_trial_feature_name: "HrefTranslate",
diff --git a/third_party/blink/renderer/platform/scheduler/common/idle_helper_unittest.cc b/third_party/blink/renderer/platform/scheduler/common/idle_helper_unittest.cc
index d3b0ba5..cf1205d 100644
--- a/third_party/blink/renderer/platform/scheduler/common/idle_helper_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/idle_helper_unittest.cc
@@ -34,8 +34,8 @@
 // To avoid symbol collisions in jumbo builds.
 namespace idle_helper_unittest {
 
-using base::sequence_manager::TaskQueue;
 using base::sequence_manager::SequenceManager;
+using base::sequence_manager::TaskQueue;
 
 void AppendToVectorTestTask(std::vector<std::string>* vector,
                             std::string value) {
@@ -185,9 +185,10 @@
     } else {
       // It's okay to use |test_task_runner_| just as a mock clock because
       // it isn't bound to thread and all tasks will go through a MessageLoop.
-      sequence_manager = base::sequence_manager::SequenceManagerForTest::Create(
-          message_loop_->GetMessageLoopBase(), message_loop_->task_runner(),
-          test_task_runner_->GetMockTickClock());
+      sequence_manager =
+          base::sequence_manager::SequenceManagerForTest::CreateOnCurrentThread(
+              SequenceManager::Settings{
+                  .clock = test_task_runner_->GetMockTickClock()});
     }
     sequence_manager_ = sequence_manager.get();
     scheduler_helper_ = std::make_unique<NonMainThreadSchedulerHelper>(
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index 41f7b67f..91d162e1 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -2079,9 +2079,9 @@
   void SetUp() override {
     clock_.Advance(base::TimeDelta::FromMilliseconds(5));
     Initialize(std::make_unique<MainThreadSchedulerImplForTest>(
-        base::sequence_manager::SequenceManagerForTest::Create(
-            message_loop_->GetMessageLoopBase(), message_loop_->task_runner(),
-            &clock_),
+        base::sequence_manager::SequenceManagerForTest::CreateOnCurrentThread(
+            base::sequence_manager::SequenceManager::Settings{.clock =
+                                                                  &clock_}),
         base::nullopt));
   }
 
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_unittest.cc
index 60162f1..d38de1e 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_unittest.cc
@@ -48,9 +48,9 @@
   void SetUp() override {
     clock_.Advance(base::TimeDelta::FromMicroseconds(5000));
     scheduler_.reset(new MainThreadSchedulerImpl(
-        base::sequence_manager::SequenceManagerForTest::Create(
-            message_loop_.GetMessageLoopBase(), message_loop_.task_runner(),
-            &clock_),
+        base::sequence_manager::SequenceManagerForTest::CreateOnCurrentThread(
+            base::sequence_manager::SequenceManager::Settings{.clock =
+                                                                  &clock_}),
         base::nullopt));
     scheduler_overrider_ =
         std::make_unique<ScopedSchedulerOverrider>(scheduler_.get());
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.cc b/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.cc
index 996be6c7..63c251a 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.cc
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.cc
@@ -15,6 +15,7 @@
 #include "third_party/blink/public/platform/web_rtc_session_description.h"
 #include "third_party/blink/public/platform/web_rtc_stats.h"
 #include "third_party/blink/public/platform/web_vector.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 
@@ -79,7 +80,7 @@
                      webrtc::DegradationPreference,
                      WebRTCVoidRequest) override {}
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                blink::RTCStatsFilter) override {}
+                const std::vector<webrtc::NonStandardGroupId>&) override {}
 
  private:
   scoped_refptr<DummyRtpSenderInternal> internal_;
@@ -133,7 +134,7 @@
     return WebVector<std::unique_ptr<WebRTCRtpSource>>();
   }
   void GetStats(std::unique_ptr<blink::WebRTCStatsReportCallback>,
-                RTCStatsFilter) override {}
+                const std::vector<webrtc::NonStandardGroupId>&) override {}
   std::unique_ptr<webrtc::RtpParameters> GetParameters() const override {
     return nullptr;
   }
@@ -314,7 +315,7 @@
 
 void MockWebRTCPeerConnectionHandler::GetStats(
     std::unique_ptr<WebRTCStatsReportCallback>,
-    blink::RTCStatsFilter) {}
+    const std::vector<webrtc::NonStandardGroupId>&) {}
 
 webrtc::RTCErrorOr<std::unique_ptr<WebRTCRtpTransceiver>>
 MockWebRTCPeerConnectionHandler::AddTransceiverWithTrack(
diff --git a/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.h b/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.h
index 4c603b0..8c6d8c0 100644
--- a/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.h
+++ b/third_party/blink/renderer/platform/testing/testing_platform_support_with_web_rtc.h
@@ -13,6 +13,7 @@
 #include "third_party/blink/public/platform/web_rtc_peer_connection_handler.h"
 #include "third_party/blink/renderer/platform/testing/testing_platform_support.h"
 #include "third_party/webrtc/api/peer_connection_interface.h"
+#include "third_party/webrtc/api/stats/rtc_stats.h"
 
 namespace blink {
 
@@ -53,7 +54,7 @@
       const webrtc::PeerConnectionInterface::RTCConfiguration&) override;
   void GetStats(const WebRTCStatsRequest&) override;
   void GetStats(std::unique_ptr<WebRTCStatsReportCallback>,
-                RTCStatsFilter) override;
+                const std::vector<webrtc::NonStandardGroupId>&) override;
   webrtc::RTCErrorOr<std::unique_ptr<WebRTCRtpTransceiver>>
   AddTransceiverWithTrack(const WebMediaStreamTrack&,
                           const webrtc::RtpTransceiverInit&) override;
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 4a9876e7..e93f44b 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
@@ -393,6 +393,12 @@
         ],
     },
     {
+        'paths': ['third_party/blink/renderer/controller/user_level_memory_pressure_signal_generator.cc'],
+        'allowed': [
+            'base::MemoryPressureListener',
+        ],
+    },
+    {
         'paths': ['third_party/blink/renderer/core/animation'],
         'allowed': [
             '[a-z_]+_functions::.+',
diff --git a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
index 307bb5e..5184f2a 100644
--- a/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
+++ b/third_party/blink/web_tests/FlagExpectations/enable-blink-features=LayoutNG
@@ -168,6 +168,7 @@
 crbug.com/591099 external/wpt/css/css-text/line-breaking/line-breaking-ic-003.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-break-word-005.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/overflow-wrap/overflow-wrap-break-word-008.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-000.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-002.html [ Pass ]
@@ -198,6 +199,7 @@
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping_lig-000.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/text-indent/text-indent-percentage-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/text-transform/text-transform-capitalize-028.html [ Failure ]
+crbug.com/591099 external/wpt/css/css-text/white-space/break-spaces-009.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/white-space/line-edge-white-space-collapse-001.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/white-space/line-edge-white-space-collapse-002.html [ Pass ]
 crbug.com/591099 external/wpt/css/css-text/white-space/pre-wrap-012.html [ Failure ]
@@ -313,6 +315,7 @@
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-001.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-align-self-vertWM-004.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/align3/grid-abspos-staticpos-justify-self-vertWM-001.html [ Failure ]
+crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-multicol-002.html [ Pass ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/descriptor-suffix.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/counter-styles-3/redefine-builtin.html [ Failure ]
 crbug.com/591099 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-align-self-horiz-002.xhtml [ Pass ]
@@ -397,10 +400,10 @@
 crbug.com/591099 fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ]
 crbug.com/591099 fast/block/float/4145535Crash.html [ Pass ]
 crbug.com/591099 fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ]
-crbug.com/591099 fast/canvas/OffscreenCanvas-copyImage.html [ Failure Pass ]
+crbug.com/591099 fast/canvas/OffscreenCanvas-copyImage.html [ Pass ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-css-tables-collapsed.html [ Failure Pass ]
 crbug.com/591099 fast/css-intrinsic-dimensions/height-positioned.html [ Pass ]
-crbug.com/591099 fast/css-intrinsic-dimensions/height-tables.html [ Failure Pass ]
+crbug.com/591099 fast/css-intrinsic-dimensions/height-tables.html [ Pass ]
 crbug.com/591099 fast/css/absolute-inline-alignment-2.html [ Pass ]
 crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ]
 crbug.com/855279 fast/css/text-overflow-ellipsis-vertical-hittest.html [ Pass ]
@@ -433,7 +436,7 @@
 crbug.com/591099 http/tests/devtools/elements/shadow/shadow-distribution.js [ Failure ]
 crbug.com/591099 http/tests/devtools/elements/styles-1/edit-value-url-with-color.js [ Pass ]
 crbug.com/591099 http/tests/devtools/elements/user-properties.js [ Pass ]
-crbug.com/591099 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Pass Timeout ]
+crbug.com/591099 http/tests/devtools/service-workers/service-worker-v8-cache.js [ Timeout ]
 crbug.com/591099 http/tests/devtools/sources/debugger-frameworks/frameworks-jquery.js [ Crash Pass ]
 crbug.com/591099 http/tests/devtools/sources/debugger/debugger-proto-property.js [ Pass ]
 crbug.com/591099 http/tests/devtools/tracing-session-id.js [ Pass ]
@@ -453,7 +456,7 @@
 crbug.com/591099 http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-disabled.html [ Failure Pass ]
 crbug.com/591099 http/tests/media/video-load-metadata-decode-error.html [ Pass ]
 crbug.com/591099 http/tests/multipart/multipart-main-resource.html [ Pass ]
-crbug.com/591099 http/tests/security/inactive-document-with-empty-security-origin.html [ Pass ]
+crbug.com/591099 http/tests/security/inactive-document-with-empty-security-origin.html [ Pass Timeout ]
 crbug.com/591099 http/tests/security/isolatedWorld/media-query-wrapper-leaks.html [ Failure ]
 crbug.com/591099 http/tests/security/upgrade-insecure-requests/iframe-upgrade.https.html [ Crash ]
 crbug.com/591099 http/tests/security/video-poster-cross-origin-crash2.html [ Pass ]
@@ -550,8 +553,11 @@
 crbug.com/591099 virtual/video-surface-layer/media/autoplay-when-visible.html [ Pass ]
 crbug.com/591099 virtual/video-surface-layer/media/color-profile-video-seek-filter.html [ Pass ]
 crbug.com/591099 virtual/video-surface-layer/media/media-ended.html [ Pass ]
+crbug.com/591099 virtual/video-surface-layer/media/stable/video-object-fit-stable.html [ Failure Pass ]
 crbug.com/591099 virtual/video-surface-layer/media/video-canvas-draw.html [ Failure ]
 crbug.com/591099 virtual/video-surface-layer/media/video-controls-hide-on-move-outside-controls.html [ Pass ]
+crbug.com/591099 virtual/video-surface-layer/media/video-object-fit-change.html [ Failure Pass ]
+crbug.com/591099 virtual/video-surface-layer/media/video-object-fit.html [ Failure Pass ]
 crbug.com/591099 virtual/webrtc-wpt-plan-b/external/wpt/webrtc/RTCIceTransport-extension.https.html [ Failure Pass ]
 crbug.com/591099 vr/getFrameData_oneframeupdate.html [ Pass ]
 crbug.com/591099 webexposed/global-interface-listing-shared-worker.html [ Pass ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 167fed3..28846cb 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -846,6 +846,7 @@
 crbug.com/874695 virtual/binary-for-devtools/http/tests/devtools/sxg/sxg-cert-not-found.js [ Slow ]
 crbug.com/874695 http/tests/devtools/sxg/sxg-disable-cache.js [ Slow ]
 crbug.com/874695 virtual/binary-for-devtools/http/tests/devtools/sxg/sxg-disable-cache.js [ Slow ]
+crbug.com/874695 virtual/sxg-with-network-service/http/tests/devtools/sxg/sxg-disable-cache.js [ Slow ]
 crbug.com/874695 virtual/threaded/animations/svg/animated-filter-svg-element.html [ Slow ]
 crbug.com/874695 virtual/disable-blink-gen-property-trees/animations/svg/animated-filter-svg-element.html [ Slow ]
 crbug.com/874695 virtual/threaded/fast/idle-callback/idle_periods.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 2aaa945a..e2c3b56 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1603,6 +1603,7 @@
 crbug.com/467127 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-008.xht [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-011.xht [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-013.html [ Failure ]
+crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-014.html [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-001.xht [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-002.xht [ Failure ]
 crbug.com/591099 virtual/layout_ng_experimental/external/wpt/css/css-flexbox/flex-minimum-width-flex-items-003.xht [ Failure ]
@@ -2124,6 +2125,22 @@
 crbug.com/720205 external/wpt/css/css-text/line-break/line-break-anywhere-001.html [ Skip ]
 crbug.com/720205 external/wpt/css/css-text/line-break/line-break-anywhere-002.html [ Skip ]
 
+# The 'overflow-wrap: anywhere' feature is not implemented yet
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-001.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-002.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-003.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-004.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-005.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-span-001.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-span-002.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-fit-content-001.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-004.html [ Skip ]
+crbug.com/905315 external/wpt/css/css-text/word-break/word-break-break-word-overflow-wrap-interactions.html [ Skip ]
+
+
 crbug.com/666657 external/wpt/css/css-text-decor/text-emphasis-color-001.xht [ Failure ]
 crbug.com/666657 external/wpt/css/css-text-decor/text-emphasis-position-above-left-001.xht [ Failure ]
 crbug.com/666657 external/wpt/css/css-text-decor/text-emphasis-position-above-left-002.xht [ Failure ]
@@ -2979,6 +2996,14 @@
 crbug.com/939181 virtual/not-site-per-process/external/wpt/html/browsers/origin/cross-origin-objects/cross-origin-objects.html [ Failure Timeout ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac10.12 ] external/wpt/service-workers/service-worker/websocket.https.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Secure-Close-4999-reason.any.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Secure-Send-data.any.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/constructor/014.html?wss [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Secure-Close-server-initiated-close.any.worker.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/constructor/018.html?wss [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/Secure-Send-binary-arraybufferview-uint8-offset.any.html [ Timeout ]
+crbug.com/626703 [ Mac10.12 ] external/wpt/websockets/constructor/010.html?wss [ Timeout ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/contain/contain-size-block-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-lists/list-item-definition.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-contain/contain-content-011.html [ Failure ]
@@ -3047,7 +3072,6 @@
 crbug.com/626703 external/wpt/css/css-text/shaping/shaping_cchar-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/shaping/shaping-014.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/shaping/shaping-015.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/word-break/word-break-break-word-overflow-wrap-interactions.html [ Failure ]
 crbug.com/626703 external/wpt/infrastructure/reftest/reftest_fuzzy.html [ Failure ]
 crbug.com/626703 external/wpt/infrastructure/reftest/reftest_fuzzy_1.html [ Failure ]
 crbug.com/626703 external/wpt/screen-orientation/onchange-event.html [ Timeout ]
@@ -3161,14 +3185,10 @@
 crbug.com/626703 external/wpt/css/css-text/white-space/pre-wrap-014.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/vert-block-size-small-or-larger-than-container-with-min-or-max-content-2b.html [ Failure ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/vert-block-size-small-or-larger-than-container-with-min-or-max-content-2a.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/pre-wrap-013.html [ Failure ]
 crbug.com/626703 external/wpt/css/CSS2/text/white-space-processing-040.xht [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/text-transform/text-transform-shaping-003.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/white-space-intrinsic-size-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-001.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-003.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-span-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/text-transform/text-transform-copy-paste-001-manual.html [ Skip ]
 crbug.com/626703 external/wpt/css/css-text/white-space/white-space-intrinsic-size-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/boundary-shaping/boundary-shaping-003.html [ Failure ]
@@ -3184,7 +3204,6 @@
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/sizing/vert-block-size-small-or-larger-than-container-with-min-or-max-content-1.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/boundary-shaping/boundary-shaping-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-sizing/range-percent-intrinsic-size-2.html [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-anywhere-005.html [ Failure ]
 crbug.com/626703 external/wpt/css/filter-effects/filter-subregion-01.html [ Failure ]
 crbug.com/626703 [ Android ] external/wpt/css/css-layout-api/auto-block-size-absolute.https.html [ Failure ]
 crbug.com/626703 [ Mac10.10 ] external/wpt/css/css-layout-api/auto-block-size-absolute.https.html [ Failure ]
@@ -3500,7 +3519,6 @@
 crbug.com/366553 external/wpt/svg/text/reftests/text-inline-size-201.svg [ Failure ]
 crbug.com/366553 external/wpt/svg/text/reftests/text-inline-size-001.svg [ Failure ]
 crbug.com/366553 external/wpt/svg/text/reftests/text-inline-size-002.svg [ Failure ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-003.html [ Failure ]
 crbug.com/366553 external/wpt/svg/text/reftests/text-inline-size-006.svg [ Failure ]
 crbug.com/366553 [ Linux ] external/wpt/svg/text/reftests/text-inline-size-003.svg [ Failure ]
 crbug.com/366553 [ Win ] external/wpt/svg/text/reftests/text-inline-size-003.svg [ Failure ]
@@ -3522,7 +3540,6 @@
 crbug.com/626703 external/wpt/content-security-policy/securitypolicyviolation/inside-service-worker.https.html [ Timeout ]
 crbug.com/626703 external/wpt/content-security-policy/securitypolicyviolation/inside-shared-worker.html [ Timeout ]
 crbug.com/626703 external/wpt/content-security-policy/securitypolicyviolation/inside-dedicated-worker.html [ Timeout ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-002.html [ Failure ]
 crbug.com/626703 external/wpt/content-security-policy/securitypolicyviolation/targeting.html [ Timeout ]
 crbug.com/626703 external/wpt/css/vendor-imports/mozilla/mozilla-central-reftests/flexbox/flexbox-column-row-gap-003.html [ Failure ]
 crbug.com/863355 [ Mac ] external/wpt/svg/shapes/reftests/pathlength-002.svg [ Failure ]
@@ -3549,7 +3566,6 @@
 crbug.com/626703 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_top [ Timeout ]
 crbug.com/626703 external/wpt/html/browsers/the-window-object/window-open-noopener.html?_self [ Failure ]
 crbug.com/626703 external/wpt/html/browsers/browsing-the-web/unloading-documents/prompt-and-unload-script-closeable.html [ Timeout ]
-crbug.com/626703 external/wpt/css/css-text/overflow-wrap/overflow-wrap-min-content-size-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-animations/CSSAnimation-effect.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-animations/event-dispatch.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/html/infrastructure/urls/resolving-urls/query-encoding/navigation.sub.html?encoding=x-cp1251 [ Timeout ]
@@ -6151,3 +6167,7 @@
 crbug.com/947023 external/wpt/fetch/sec-metadata/font.tentative.https.sub.html [ Pass Failure ]
 crbug.com/947023 external/wpt/fetch/sec-metadata/report.tentative.https.sub.html [ Pass Timeout ]
 crbug.com/947023 external/wpt/fetch/sec-metadata/xslt.tentative.https.sub.html [ Pass Failure ]
+
+## Temp while landing a fix from webrtc importer
+crbug.com/948055 external/wpt/webrtc/RTCDataChannel-id.html [ Failure Pass ]
+
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
index fe1da414..8de0fd9c 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_5.json
@@ -41509,6 +41509,18 @@
      {}
     ]
    ],
+   "css/css-flexbox/flex-minimum-height-flex-items-014.html": [
+    [
+     "/css/css-flexbox/flex-minimum-height-flex-items-014.html",
+     [
+      [
+       "/css/reference/ref-filled-green-100px-square.xht",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-flexbox/flex-minimum-width-flex-items-001.xht": [
     [
      "/css/css-flexbox/flex-minimum-width-flex-items-001.xht",
@@ -66311,6 +66323,18 @@
      {}
     ]
    ],
+   "css/css-text/white-space/break-spaces-003.html": [
+    [
+     "/css/css-text/white-space/break-spaces-003.html",
+     [
+      [
+       "/css/css-text/white-space/reference/white-space-break-spaces-005-ref.html",
+       "=="
+      ]
+     ],
+     {}
+    ]
+   ],
    "css/css-text/white-space/break-spaces-004.html": [
     [
      "/css/css-text/white-space/break-spaces-004.html",
@@ -203561,31 +203585,11 @@
      {}
     ]
    ],
-   "xhr/abort-during-upload-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "xhr/data-uri-expected.txt": [
     [
      {}
     ]
    ],
-   "xhr/event-error-order.sub-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "xhr/event-loadstart-upload-expected.txt": [
-    [
-     {}
-    ]
-   ],
-   "xhr/event-timeout-order-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "xhr/folder.txt": [
     [
      {}
@@ -204226,11 +204230,6 @@
      {}
     ]
    ],
-   "xhr/send-response-event-order-expected.txt": [
-    [
-     {}
-    ]
-   ],
    "xhr/setrequestheader-combining.window-expected.txt": [
     [
      {}
@@ -303932,7 +303931,9 @@
    "workers/modules/dedicated-worker-options-credentials.html": [
     [
      "/workers/modules/dedicated-worker-options-credentials.html",
-     {}
+     {
+      "timeout": "long"
+     }
     ]
    ],
    "workers/modules/dedicated-worker-options-type.html": [
@@ -349591,7 +349592,7 @@
    "reftest"
   ],
   "css/css-contain/contain-size-multicol-001.html": [
-   "5c0dba9b7bb56792542decc9abd8fcebd8ab967a",
+   "81465c02d6114aa4a27637b2e77b3d62161c0864",
    "reftest"
   ],
   "css/css-contain/contain-size-replaced-001.html": [
@@ -351178,6 +351179,10 @@
    "9989b6463780fad120724ab52998353958650c81",
    "reftest"
   ],
+  "css/css-flexbox/flex-minimum-height-flex-items-014.html": [
+   "b130ff5561f721d69058902f9c5081b3f6471ace",
+   "reftest"
+  ],
   "css/css-flexbox/flex-minimum-width-flex-items-001.xht": [
    "b8e2866edaa46af46900c287238894cd8ddef24c",
    "reftest"
@@ -369679,7 +369684,7 @@
    "testharness"
   ],
   "css/css-properties-values-api/registered-property-initial.html": [
-   "17c883a689a15ef5abd4babfc3afb70c3c6745a9",
+   "2fa062f310e86220ce331a49fdcb4d5abb4094f0",
    "testharness"
   ],
   "css/css-properties-values-api/resources/utils.js": [
@@ -378214,6 +378219,10 @@
    "dd9b9919fbb73ec843b5480bba3b7bfb21ed873f",
    "reftest"
   ],
+  "css/css-text/white-space/break-spaces-003.html": [
+   "c0101fd7dec54322034890dbc9e4f8d613379d02",
+   "reftest"
+  ],
   "css/css-text/white-space/break-spaces-004.html": [
    "13770b7b8d189a404d44e73dfe19eba1c0e48b58",
    "reftest"
@@ -389951,11 +389960,11 @@
    "testharness"
   ],
   "css/css-values/calc-numbers-expected.txt": [
-   "3ebcb2f87bfe7168720b04767ce6ea11f08229f4",
+   "2a2ff3540381d8b85147eb2bd191473126c113f7",
    "support"
   ],
   "css/css-values/calc-numbers.html": [
-   "e9ade71e22f5d20bbb8de15c6ddf9acd99fd44b6",
+   "995595b8a3e91ab3a72ec465d509030f082ea5bf",
    "testharness"
   ],
   "css/css-values/calc-parenthesis-stack.html": [
@@ -420127,7 +420136,7 @@
    "testharness"
   ],
   "html/dom/interfaces.https_exclude=(Document_Window_HTML._)-expected.txt": [
-   "84ed1fbde617c5619932dcb5630adfdd3cfae218",
+   "d9a59c802f3368cc0d818e3f221e9e1e60e545e0",
    "support"
   ],
   "html/dom/interfaces.https_include=(Document_Window)-expected.txt": [
@@ -420135,11 +420144,11 @@
    "support"
   ],
   "html/dom/interfaces.https_include=HTML._-expected.txt": [
-   "4759a10e89cd70fb933b99a9afa74f67ab88386e",
+   "30f6380895dccf96a268f3295abb483c20f1cdff",
    "support"
   ],
   "html/dom/interfaces.worker-expected.txt": [
-   "421fe46ceea51e655fc42599ffd797000277574c",
+   "e00efd48545cc2325bdae4e89772d2a4f42169e2",
    "support"
   ],
   "html/dom/interfaces.worker.js": [
@@ -436811,7 +436820,7 @@
    "support"
   ],
   "interfaces/html.idl": [
-   "641213d1bb6fd47d3cb66f84661b8d658e76b641",
+   "db7f77fce298167a629b173cb06fe8107cf167e5",
    "support"
   ],
   "interfaces/image-capture.idl": [
@@ -469435,7 +469444,7 @@
    "support"
   ],
   "tools/manifest/item.py": [
-   "5e313faa751e8f32dc92c14d0dfc0bde44fce535",
+   "b6d33e8452cde01b525a3336c8a11d0012c7037c",
    "support"
   ],
   "tools/manifest/log.py": [
@@ -469443,7 +469452,7 @@
    "support"
   ],
   "tools/manifest/manifest.py": [
-   "afbc92ae8ab2eaa58a2c5fbd4004d6c4785db9e8",
+   "bfe57c7823b26f778e81fb793a7cb9b0fdfd264a",
    "support"
   ],
   "tools/manifest/sourcefile.py": [
@@ -469451,7 +469460,7 @@
    "support"
   ],
   "tools/manifest/update.py": [
-   "217d767cece27dad2303e63c540c9d1dd7daa15d",
+   "321cfebe2a605c9a50267129ed574127ed023634",
    "support"
   ],
   "tools/manifest/utils.py": [
@@ -473607,7 +473616,7 @@
    "support"
   ],
   "tools/wpt/browser.py": [
-   "f5bc7c0af02697c29818a8800c1d11a379023790",
+   "52157bca4e71a545977444e4277bd4bb7b9ffb9a",
    "support"
   ],
   "tools/wpt/commands.json": [
@@ -473675,7 +473684,7 @@
    "support"
   ],
   "tools/wptrunner/requirements.txt": [
-   "f17b12b3dddffd988bf05b1255761b713e28ca49",
+   "f2a336875f0ed137c40d79e3bab7f64e69b99d40",
    "support"
   ],
   "tools/wptrunner/requirements_chrome.txt": [
@@ -473803,19 +473812,19 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/config.py": [
-   "5bd3f467f3eda5f564ca5c51540f23b2521a2a58",
+   "d2a61a87594bc8f7753530ab3bd02795b68e3c37",
    "support"
   ],
   "tools/wptrunner/wptrunner/environment.py": [
-   "6563721caee8288047ac84ef62456ce0723738bc",
+   "e7a9e4b1e771bc37f458284a454f443216e28bb4",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/__init__.py": [
-   "a580730db82d832517212a1788b894419a300f38",
+   "bf829d93e968d4a6bccfa6798fb974bf98ff7d60",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/base.py": [
-   "5fa30563890cc1d95bc7cd1843c0aeca4dd3e197",
+   "f35c03a30e8f222b3cf33a4bda66e73e33853cdd",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executorchrome.py": [
@@ -473855,7 +473864,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executorwebdriver.py": [
-   "563252ce2bbfee5a3a92fd39d8c171d8aacdeb18",
+   "e449390116b06fb11208dc9fb078f6c1e37c4f8c",
    "support"
   ],
   "tools/wptrunner/wptrunner/executors/executorwebkit.py": [
@@ -473919,7 +473928,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/formatters/tests/test_chromium.py": [
-   "22d9fb4e7ea022ed109047c0887a3443d19bc28c",
+   "12962f4d8bcab0578912fa88ea4156e5adf0dd7f",
    "support"
   ],
   "tools/wptrunner/wptrunner/formatters/wptreport.py": [
@@ -473931,19 +473940,19 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/manifestexpected.py": [
-   "fb3ef627d94dc643f2e64fb0c7203621214e4267",
+   "b6ef63dbb367dc1510e2e056150067439fd725aa",
    "support"
   ],
   "tools/wptrunner/wptrunner/manifestinclude.py": [
-   "a68fdeb39bc6f63d387544952a1ee28ea6a2f18d",
+   "46618c98cf456fd718d0b81f25768d83c5a9e88f",
    "support"
   ],
   "tools/wptrunner/wptrunner/manifestupdate.py": [
-   "86ac55f7915728d914c98a1ef292875578b5d7a8",
+   "452c583d32737f8c85e6fc8784744223350cdacb",
    "support"
   ],
   "tools/wptrunner/wptrunner/metadata.py": [
-   "b951ea5b9b43b27d2cf37ccbe17686c780cbd326",
+   "253ab8ed994a0324457e17da5f5d5da105f69c95",
    "support"
   ],
   "tools/wptrunner/wptrunner/products.py": [
@@ -473979,15 +473988,15 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/testloader.py": [
-   "04d4a32821fa2f90a576c6a013c3c1641de967ac",
+   "7b9bbf323703512cec532802f0346dcc0a7f2f13",
    "support"
   ],
   "tools/wptrunner/wptrunner/testrunner.py": [
-   "02ea2ce59c2eecf15bb707f405a31aaad2a3a282",
+   "9228af6369654f9e63e58c8cce2c1905ab11e458",
    "support"
   ],
   "tools/wptrunner/wptrunner/update/__init__.py": [
-   "9ff3e69f94efbf3e803a8a65c46d09c0269ca063",
+   "2626183fc80dbc75d3d285de79a7d386f53ce6e3",
    "support"
   ],
   "tools/wptrunner/wptrunner/update/base.py": [
@@ -473995,15 +474004,15 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/update/metadata.py": [
-   "5c42fa3267115d2820eb67025b89884f72f7f345",
+   "d7e8ba2b47c12731ac80dc33ade34cc03299d582",
    "support"
   ],
   "tools/wptrunner/wptrunner/update/state.py": [
-   "ad58513a5d9d82d83f7f8efc104098457c5f921c",
+   "64dbf1180604cd8df7a468e036447f95b80371b0",
    "support"
   ],
   "tools/wptrunner/wptrunner/update/sync.py": [
-   "c2d0bfa7f0d69f35dede87e3255acb0412d88db7",
+   "0d75a1232fc0cba9fbd6e8a3363adea0475dd436",
    "support"
   ],
   "tools/wptrunner/wptrunner/update/tree.py": [
@@ -474011,7 +474020,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/update/update.py": [
-   "fa0909b3d248c72de65e188c9ebbdb52ba271915",
+   "a0f42377734b1963d7df1ce1dcb3472be4b7781c",
    "support"
   ],
   "tools/wptrunner/wptrunner/vcs.py": [
@@ -474023,15 +474032,15 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wptcommandline.py": [
-   "fef246ddba168e634041fbef17e806969dace26c",
+   "080b1c6b00aa963a01d62eeafd51377fe43eea49",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptlogging.py": [
-   "ac311816c18b7f898e4421410f97d9357d2edd2d",
+   "9e3ff54593ffe27daf604694e8a9d5b486fa9f7c",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/__init__.py": [
-   "8985b5ae35067a24fbc87fdd2e61d72794123892",
+   "e354d5ff4f829d7930c0de61a5efe71081374621",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/backends/__init__.py": [
@@ -474051,11 +474060,11 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/parser.py": [
-   "9e0ff029b847a4599f7844bec7d63e4b5834afc0",
+   "e6c2e5b5ca28162e5df41c51a0b96dfcf6b3eabe",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/serializer.py": [
-   "a7e01313ae5407c6086c60c45d4ab7059ccb2ba2",
+   "e4749128bf96d64dc17f7c8c0d727b79813ea496",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/tests/__init__.py": [
@@ -474067,7 +474076,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py": [
-   "98b54dc11ea8a033b8ee626b5f8bb924759959cc",
+   "a2a7dadc043b64ff8c9fdc2c4a3cb3837c52c4a0",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py": [
@@ -474079,7 +474088,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py": [
-   "a64ce0c7bb7d8d089a8cb1365c0477a08652eacc",
+   "e0fb8559a1e793b1f4a26b39a1333f6e23d38b4b",
    "support"
   ],
   "tools/wptrunner/wptrunner/wptrunner.py": [
@@ -474087,7 +474096,7 @@
    "support"
   ],
   "tools/wptrunner/wptrunner/wpttest.py": [
-   "6a4fa4fdf82dca14e44d8e3c6d63ce2c7e2b56b2",
+   "c2279eaaa2460b21b552f594797e41e7ffc7fd3f",
    "support"
   ],
   "tools/wptserve/LICENSE": [
@@ -479587,11 +479596,11 @@
    "testharness"
   ],
   "webrtc/RTCDataChannel-id-expected.txt": [
-   "e2bcf02cde0a56d74e3dc21c30a2409fc4afa025",
+   "d7f04467226efe89dc032b07858187f013182a15",
    "support"
   ],
   "webrtc/RTCDataChannel-id.html": [
-   "4c16547ca780c5285fbb2a264bfaf7b10b43eab6",
+   "0cf01976ff0eeb66c51ded321e777123f063b02c",
    "testharness"
   ],
   "webrtc/RTCDataChannel-send-expected.txt": [
@@ -485871,7 +485880,7 @@
    "testharness"
   ],
   "workers/modules/dedicated-worker-options-credentials.html": [
-   "34f223981ca9213e85a0c4c05a9b13d6fdc1b095",
+   "03736cbb6202be0e7861e939308960b91c11ccd2",
    "testharness"
   ],
   "workers/modules/dedicated-worker-options-credentials.html.headers": [
@@ -486890,10 +486899,6 @@
    "a5bc7c27364a43a867700b7e1c27d01f8b8e662b",
    "testharness"
   ],
-  "xhr/abort-during-upload-expected.txt": [
-   "237ed148cbafe8ef11f4a7862c3a5d6e686b32f7",
-   "support"
-  ],
   "xhr/abort-during-upload.htm": [
    "9732791d953c6e497df6627d86e4a1ee179cb6a3",
    "testharness"
@@ -487134,10 +487139,6 @@
    "2f80d1b60780a4c274a4ade882555e6e7a1b8845",
    "testharness"
   ],
-  "xhr/event-error-order.sub-expected.txt": [
-   "2187b4ee596cf3744d5fea22de540027bef23eaa",
-   "support"
-  ],
   "xhr/event-error-order.sub.html": [
    "f03707eb98d7f5737c6aec44d0de4c043deb3731",
    "testharness"
@@ -487154,10 +487155,6 @@
    "b17d9b9134ea8669fd440433c0d0d9ffc1a729db",
    "testharness"
   ],
-  "xhr/event-loadstart-upload-expected.txt": [
-   "10e17a762afa27e1e3153960572272fc994e86ca",
-   "support"
-  ],
   "xhr/event-loadstart-upload.htm": [
    "275d418a7e090e11e20a60acac31e87978fe64c5",
    "testharness"
@@ -487178,10 +487175,6 @@
    "6cbcc22a3308a1d1f7921a47f27cf57722dfabc2",
    "testharness"
   ],
-  "xhr/event-timeout-order-expected.txt": [
-   "6aa711000ff8e14a854bb9ad688fcb201339e052",
-   "support"
-  ],
   "xhr/event-timeout-order.htm": [
    "d4dc78010a74df528fae081beb270a51b25e94d3",
    "testharness"
@@ -488310,10 +488303,6 @@
    "16b3231e25b4d78712f2f29df6ca5221c1964356",
    "testharness"
   ],
-  "xhr/send-response-event-order-expected.txt": [
-   "4aa45e1cfd80aa0763249e858d206f58127db5ac",
-   "support"
-  ],
   "xhr/send-response-event-order.htm": [
    "041cb23c6ea891c0e0dc4f0bc165bff71249a5bc",
    "testharness"
diff --git a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/computed-float-position-absolute-expected.txt b/third_party/blink/web_tests/external/wpt/css/CSS2/floats/computed-float-position-absolute-expected.txt
deleted file mode 100644
index f9b2c8a3..0000000
--- a/third_party/blink/web_tests/external/wpt/css/CSS2/floats/computed-float-position-absolute-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL The computed value of float with absolute positioning when there is no box should be "none" assert_equals: [display:none] Invalid gCS(test1)['float']; expected "none" but got "left"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-014.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-014.html
new file mode 100644
index 0000000..b130ff55
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/flex-minimum-height-flex-items-014.html
@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<title>CSS Flexbox: min-height: auto with nested flexboxes and justify-content</title>
+<link rel="author" title="Google LLC" href="https://www.google.com/" />
+<link rel="help" href="https://drafts.csswg.org/css-flexbox/#min-size-auto" />
+<link rel="issue" href="https://bugs.chromium.org/p/chromium/issues/detail?id=945214" />
+<link rel="match" href="../reference/ref-filled-green-100px-square.xht" />
+
+<style>
+.overlapped-green {
+  position: absolute;
+  background-color: green;
+  width: 100px;
+  height: 100px;
+  z-index: 1;
+}
+
+.outer {
+  display: flex;
+  flex-direction: column;
+  height: 100px;
+  width: 100px;
+  background: green;
+}
+
+.inner {
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-end;
+  height: 100%;
+  background-color: red;
+}
+
+.spacer {
+  height: 30px;
+  width: 100px;
+  background: red;
+  flex: none;
+}
+</style>
+<body>
+
+<p>Test passes if there is a filled green square and <strong>no red</strong>.</p>
+
+<div class="overlapped-green"></div>
+<div class="outer">
+  <div class="spacer"></div>
+  <div class="inner">
+    <div class="spacer"></div>
+  </div>
+</div>
+
+
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-initial.html b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-initial.html
index 17c883a..2fa062f3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-initial.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-properties-values-api/registered-property-initial.html
@@ -30,6 +30,10 @@
 test_initial_value({ syntax: '<transform-function>', initialValue: 'rotate(42deg)' }, 'rotate(42deg)');
 test_initial_value({ syntax: '<transform-list>', initialValue: 'scale(calc(2 + 2))' }, 'scale(4)');
 test_initial_value({ syntax: '<transform-list>', initialValue: 'scale(calc(2 + 1)) translateX(calc(3px + 1px))' }, 'scale(3) translateX(4px)');
+test_initial_value({ syntax: '<url>', initialValue: 'url(a)' },
+    `url("${new URL('a', document.baseURI)}")`);
+test_initial_value({ syntax: '<url>+', initialValue: 'url(a) url(a)' },
+    `url("${new URL('a', document.baseURI)}") url("${new URL('a', document.baseURI)}")`);
 
 // Test that the initial value of the custom property 'reg' is successfully
 // substituted into 'property'.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-003.html b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-003.html
new file mode 100644
index 0000000..c0101fd7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/white-space/break-spaces-003.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>CSS Text Test: white-space: break-spaces</title>
+<link rel="author" title="Javier Fernandez Garcia-Boente" href="mailto:jfernandez@igalia.com">
+<link rel="help" title="3. White Space and Wrapping: the white-space property" href="https://drafts.csswg.org/css-text-3/#white-space-property">
+<link rel="help" title="5.2. Breaking Rules for Letters: the word-break property" href="https://drafts.csswg.org/css-text-3/#word-break-property">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-white-space-break-spaces">
+<link rel="help" href="https://drafts.csswg.org/css-text-3/#valdef-word-break-break-word">
+<meta name="flags" content="ahem">
+<link rel="match" href="reference/white-space-break-spaces-005-ref.html">
+<meta name="assert" content="break-word + break-spaces do not allow a break
+between the last character of a word and the first space of a sequence of preserved spaces
+if there are other wrapping opportunities earlier in the line.">
+<style>
+div {
+   position: relative;
+   font: 25px/1 Ahem;
+}
+.fail {
+  position: absolute;
+  color: red;
+  z-index: -1;
+}
+span { color: green; }
+.test {
+  color: green;
+  width: 4ch;
+
+  white-space: break-spaces;
+  word-break: break-word;
+}
+</style>
+<body>
+  <p>Test passes if there is a <strong>filled green square</strong> and <strong>no red</strong>.</p>
+  <div class="fail">XX<span>XX</span><br>X<span>X</span>X<span>X<br>XXXX<br>XXXX</span></div>
+  <div class="test">XX X X</div>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers-expected.txt
index 3ebcb2f..2a2ff354 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers-expected.txt
@@ -2,7 +2,7 @@
 PASS testing tab-size: calc(2 * 3)
 FAIL testing tab-size: calc(2 * -4) assert_equals: calc(2 * -4) should compute to 0 expected "0" but got "12345"
 PASS testing opacity: calc(2 / 4)
-PASS testing tab-size: calc(2 / 4)
+FAIL testing tab-size: calc(2 / 4) assert_equals: calc(2 / 4) should compute to 0.5 expected "0.5" but got "1"
 PASS testing opacity: calc(2 / 4) * 1px
 PASS testing tab-size: calc(1 + 1px)
 PASS testing tab-size: calc(1 + 100%)
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers.html b/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers.html
index e9ade71..995595b 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/calc-numbers.html
@@ -71,7 +71,7 @@
 
     verifyComputedStyle("opacity", "initial", "calc(2 / 4)", "0.5", "testing opacity: calc(2 / 4)");
 
-    verifyComputedStyle("tab-size", "12345", "calc(2 / 4)", "1", "testing tab-size: calc(2 / 4)");
+    verifyComputedStyle("tab-size", "12345", "calc(2 / 4)", "0.5", "testing tab-size: calc(2 / 4)");
     /*
     'tab-size' accepts <number> values.
     */
diff --git "a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt" "b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
index 84ed1fbd..d9a59c8 100644
--- "a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
+++ "b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_exclude=\050Document_Window_HTML._\051-expected.txt"
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1154 tests; 1137 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1148 tests; 1131 PASS, 17 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS Partial interface Document: original interface defined
 PASS Partial interface mixin NavigatorID: original interface mixin defined
@@ -643,12 +643,6 @@
 PASS CustomElementRegistry interface: operation get(DOMString)
 PASS CustomElementRegistry interface: operation whenDefined(DOMString)
 PASS CustomElementRegistry interface: operation upgrade(Node)
-PASS ElementInternals interface: existence and properties of interface object
-PASS ElementInternals interface object length
-PASS ElementInternals interface object name
-PASS ElementInternals interface: existence and properties of interface prototype object
-PASS ElementInternals interface: existence and properties of interface prototype object's "constructor" property
-PASS ElementInternals interface: existence and properties of interface prototype object's @@unscopables property
 PASS DataTransfer interface: existence and properties of interface object
 PASS DataTransfer interface object length
 PASS DataTransfer interface object name
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
index 4759a10e..30f6380 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.https_include=HTML._-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 3613 tests; 3568 PASS, 45 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 3615 tests; 3570 PASS, 45 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS Partial interface Document: original interface defined
 PASS Partial interface mixin NavigatorID: original interface mixin defined
@@ -100,7 +100,6 @@
 PASS HTMLElement interface: attribute spellcheck
 PASS HTMLElement interface: attribute autocapitalize
 PASS HTMLElement interface: attribute innerText
-PASS HTMLElement interface: operation attachInternals()
 PASS HTMLElement interface: attribute onabort
 PASS HTMLElement interface: attribute onauxclick
 PASS HTMLElement interface: attribute onblur
@@ -190,7 +189,6 @@
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "spellcheck" with the proper type
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "autocapitalize" with the proper type
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "innerText" with the proper type
-PASS HTMLElement interface: document.createElement("noscript") must inherit property "attachInternals()" with the proper type
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "onabort" with the proper type
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "onauxclick" with the proper type
 PASS HTMLElement interface: document.createElement("noscript") must inherit property "onblur" with the proper type
@@ -331,6 +329,8 @@
 PASS HTMLLinkElement interface: attribute hreflang
 PASS HTMLLinkElement interface: attribute type
 PASS HTMLLinkElement interface: attribute sizes
+PASS HTMLLinkElement interface: attribute imageSrcset
+PASS HTMLLinkElement interface: attribute imageSizes
 PASS HTMLLinkElement interface: attribute referrerPolicy
 PASS HTMLLinkElement interface: attribute charset
 PASS HTMLLinkElement interface: attribute rev
@@ -347,6 +347,8 @@
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "hreflang" with the proper type
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "type" with the proper type
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "sizes" with the proper type
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "imageSrcset" with the proper type
+PASS HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "referrerPolicy" with the proper type
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "charset" with the proper type
 PASS HTMLLinkElement interface: document.createElement("link") must inherit property "rev" with the proper type
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.worker-expected.txt b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.worker-expected.txt
index 421fe46..e00efd4 100644
--- a/third_party/blink/web_tests/external/wpt/html/dom/interfaces.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/html/dom/interfaces.worker-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 653 tests; 612 PASS, 41 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 652 tests; 611 PASS, 41 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS Partial interface Document: original interface defined
 PASS Partial interface mixin NavigatorID: original interface mixin defined
@@ -278,7 +278,6 @@
 PASS OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
 PASS OffscreenCanvasRenderingContext2D interface: operation ellipse(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)
 PASS CustomElementRegistry interface: existence and properties of interface object
-PASS ElementInternals interface: existence and properties of interface object
 PASS DataTransfer interface: existence and properties of interface object
 PASS DataTransferItemList interface: existence and properties of interface object
 PASS DataTransferItem interface: existence and properties of interface object
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/html.idl b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
index 641213d..db7f77fc 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/html.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/html.idl
@@ -114,8 +114,6 @@
   [CEReactions] attribute DOMString autocapitalize;
 
   [CEReactions] attribute [TreatNullAs=EmptyString] DOMString innerText;
-
-  ElementInternals attachInternals();
 };
 
 HTMLElement includes GlobalEventHandlers;
@@ -178,6 +176,8 @@
   [CEReactions] attribute DOMString hreflang;
   [CEReactions] attribute DOMString type;
   [SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
+  [CEReactions] attribute USVString imageSrcset;
+  [CEReactions] attribute DOMString imageSizes;
   [CEReactions] attribute DOMString referrerPolicy;
 };
 HTMLLinkElement includes LinkStyle;
@@ -1412,11 +1412,6 @@
   DOMString extends;
 };
 
-[Exposed=Window]
-interface ElementInternals {
-
-};
-
 dictionary FocusOptions {
   boolean preventScroll = false;
 };
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/item.py b/third_party/blink/web_tests/external/wpt/tools/manifest/item.py
index 5e313faa..b6d33e8 100644
--- a/third_party/blink/web_tests/external/wpt/tools/manifest/item.py
+++ b/third_party/blink/web_tests/external/wpt/tools/manifest/item.py
@@ -63,28 +63,19 @@
 
     def __init__(self, tests_root, path, url_base, url, **extras):
         super(URLManifestItem, self).__init__(tests_root, path)
+        assert url_base[0] == "/"
         self.url_base = url_base
+        assert url[0] != "/"
         self._url = url
         self._extras = extras
 
     @property
-    def _source_file(self):
-        """create a SourceFile for the item"""
-        from .sourcefile import SourceFile
-        return SourceFile(self._tests_root, self.path, self.url_base)
-
-    @property
     def id(self):
         return self.url
 
     @property
     def url(self):
         # we can outperform urljoin, because we know we just have path relative URLs
-        if self._url[0] == "/":
-            # TODO: MANIFEST6
-            # this is actually a bug in older generated manifests, _url shouldn't
-            # be an absolute path
-            return self._url
         if self.url_base == "/":
             return "/" + self._url
         return urljoin(self.url_base, self._url)
@@ -125,12 +116,7 @@
 
     @property
     def script_metadata(self):
-        if "script_metadata" in self._extras:
-            return self._extras["script_metadata"]
-        else:
-            # TODO: MANIFEST6
-            # this branch should go when the manifest version is bumped
-            return self._source_file.script_metadata
+        return self._extras.get("script_metadata")
 
     def to_json(self):
         rv = super(TestharnessTest, self).to_json()
@@ -140,8 +126,7 @@
             rv[-1]["testdriver"] = self.testdriver
         if self.jsshell:
             rv[-1]["jsshell"] = True
-        if self.script_metadata is not None:
-            # we store this even if it is [] to avoid having to read the source file
+        if self.script_metadata:
             rv[-1]["script_metadata"] = self.script_metadata
         return rv
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
index afbc92a..bfe57c782 100644
--- a/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
+++ b/third_party/blink/web_tests/external/wpt/tools/manifest/manifest.py
@@ -15,7 +15,7 @@
 except ImportError:
     fast_json = json
 
-CURRENT_VERSION = 5
+CURRENT_VERSION = 6
 
 
 class ManifestError(Exception):
@@ -68,8 +68,8 @@
             self.load(key)
         return self.data[key]
 
-    def __bool__(self):
-        return bool(self.data)
+    def __nonzero__(self):
+        return bool(self.data) or bool(self.json_data)
 
     def __len__(self):
         rv = len(self.data)
@@ -86,6 +86,10 @@
             raise KeyError
 
     def __setitem__(self, key, value):
+        if self.json_data is not None:
+            path = from_os_path(key)
+            if path in self.json_data:
+                del self.json_data[path]
         self.data[key] = value
 
     def __contains__(self, key):
diff --git a/third_party/blink/web_tests/external/wpt/tools/manifest/update.py b/third_party/blink/web_tests/external/wpt/tools/manifest/update.py
index 217d767..321cfebe 100755
--- a/third_party/blink/web_tests/external/wpt/tools/manifest/update.py
+++ b/third_party/blink/web_tests/external/wpt/tools/manifest/update.py
@@ -33,7 +33,7 @@
     path = kwargs["path"]
     assert tests_root is not None
 
-    if kwargs["download"]:
+    if not kwargs["rebuild"] and kwargs["download"]:
         download_from_github(path, tests_root)
 
     manifest.load_and_update(tests_root,
diff --git a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
index f5bc7c0..52157bca 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wpt/browser.py
@@ -101,7 +101,7 @@
         product = {
             "nightly": "firefox-nightly-latest-ssl",
             "beta": "firefox-beta-latest-ssl",
-            "stable": "firefox-beta-latest-ssl"
+            "stable": "firefox-latest-ssl"
         }
 
         os_builds = {
@@ -267,7 +267,7 @@
         if version:
             dest = os.path.join(dest, version)
         have_cache = False
-        if os.path.exists(dest):
+        if os.path.exists(dest) and len(os.listdir(dest)) > 0:
             if channel != "nightly":
                 have_cache = True
             else:
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements.txt b/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements.txt
index f17b12b..f2a3368 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements.txt
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/requirements.txt
@@ -5,3 +5,4 @@
 pillow==5.4.1
 urllib3[secure]==1.24.1
 requests==2.21.0
+six>=1.8
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/config.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/config.py
index 5bd3f46..d2a61a8 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/config.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/config.py
@@ -1,4 +1,4 @@
-import ConfigParser
+from six.moves.configparser import SafeConfigParser
 import os
 import sys
 from collections import OrderedDict
@@ -20,7 +20,7 @@
 def read(config_path):
     config_path = os.path.abspath(config_path)
     config_root = os.path.split(config_path)[0]
-    parser = ConfigParser.SafeConfigParser()
+    parser = SafeConfigParser()
     success = parser.read(config_path)
     assert config_path in success, success
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/environment.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/environment.py
index 6563721..e7a9e4b 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/environment.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/environment.py
@@ -8,12 +8,16 @@
 
 from mozlog import get_default_logger, handlers, proxy
 
-from wptlogging import LogLevelRewriter
-from wptserve.handlers import StringHandler
+from .wptlogging import LogLevelRewriter
 
 here = os.path.split(__file__)[0]
 repo_root = os.path.abspath(os.path.join(here, os.pardir, os.pardir, os.pardir))
 
+sys.path.insert(0, repo_root)
+from tools import localpaths  # noqa: flake8
+
+from wptserve.handlers import StringHandler
+
 serve = None
 
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/__init__.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/__init__.py
index a580730..bf829d9 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/__init__.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/__init__.py
@@ -1,5 +1,5 @@
 # flake8: noqa (not ideal, but nicer than adding noqa: F401 to every line!)
-from base import (executor_kwargs,
-                  testharness_result_converter,
-                  reftest_result_converter,
-                  TestExecutor)
+from .base import (executor_kwargs,
+                   testharness_result_converter,
+                   reftest_result_converter,
+                   TestExecutor)
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/base.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/base.py
index 5fa3056..f35c03a3 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/base.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/base.py
@@ -1,18 +1,18 @@
 import base64
 import hashlib
-import httplib
+from six.moves.http_client import HTTPConnection
 import io
 import os
 import threading
 import traceback
 import socket
-import urlparse
+from six.moves.urllib.parse import urljoin, urlsplit, urlunsplit
 from abc import ABCMeta, abstractmethod
 
 from PIL import Image, ImageChops, ImageStat
 
 from ..testrunner import Stop
-from protocol import Protocol, BaseProtocolPart
+from .protocol import Protocol, BaseProtocolPart
 
 here = os.path.split(__file__)[0]
 
@@ -50,10 +50,10 @@
 
     e.g. http://example.org:8000/tests?id=1#2 becomes /tests?id=1#2"""
 
-    url_parts = list(urlparse.urlsplit(url))
+    url_parts = list(urlsplit(url))
     url_parts[0] = ""
     url_parts[1] = ""
-    return urlparse.urlunsplit(url_parts)
+    return urlunsplit(url_parts)
 
 
 class TestharnessResultConverter(object):
@@ -213,7 +213,7 @@
                                self.server_config["ports"][protocol][0])
 
     def test_url(self, test):
-        return urlparse.urljoin(self.server_url(test.environment["protocol"]), test.url)
+        return urljoin(self.server_url(test.environment["protocol"]), test.url)
 
     @abstractmethod
     def do_test(self, test):
@@ -563,7 +563,7 @@
         An HTTP request to an invalid path that results in a 404 is
         proof enough to us that the server is alive and kicking.
         """
-        conn = httplib.HTTPConnection(self.server.host, self.server.port)
+        conn = HTTPConnection(self.server.host, self.server.port)
         conn.request("HEAD", self.server.base_path + "invalid")
         res = conn.getresponse()
         return res.status == 404
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index 563252c..e449390 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -356,6 +356,20 @@
         while True:
             result = protocol.base.execute_script(
                 self.script_resume % format_map, async=True)
+
+            # As of 2019-03-29, WebDriver does not define expected behavior for
+            # cases where the browser crashes during script execution:
+            #
+            # https://github.com/w3c/webdriver/issues/1308
+            if not isinstance(result, list) or len(result) != 2:
+                try:
+                    is_alive = self.is_alive()
+                except client.WebDriverException:
+                    is_alive = False
+
+                if not is_alive:
+                    raise Exception("Browser crashed during script execution.")
+
             done, rv = handler(result)
             if done:
                 break
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
index 22d9fb4..12962f4 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
@@ -1,7 +1,7 @@
 import json
 import sys
 from os.path import dirname, join
-from StringIO import StringIO
+from six.moves import cStringIO as StringIO
 
 from mozlog import handlers, structuredlog
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestexpected.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestexpected.py
index fb3ef62..b6ef63dbb 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestexpected.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestexpected.py
@@ -1,5 +1,5 @@
 import os
-import urlparse
+from six.moves.urllib.parse import urljoin
 from collections import deque
 
 from wptmanifest.backends import static
@@ -236,8 +236,8 @@
 
     @property
     def url(self):
-        return urlparse.urljoin(self.url_base,
-                                "/".join(self.test_path.split(os.path.sep)))
+        return urljoin(self.url_base,
+                       "/".join(self.test_path.split(os.path.sep)))
 
     @property
     def disabled(self):
@@ -364,7 +364,7 @@
 
     @property
     def id(self):
-        return urlparse.urljoin(self.parent.url, self.name)
+        return urljoin(self.parent.url, self.name)
 
     @property
     def disabled(self):
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestinclude.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestinclude.py
index a68fdeb..46618c9 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestinclude.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestinclude.py
@@ -6,7 +6,7 @@
 """
 import glob
 import os
-import urlparse
+from six.moves.urllib.parse import urlparse, urlsplit
 
 from wptmanifest.node import DataNode
 from wptmanifest.backends import conditional
@@ -68,7 +68,7 @@
 
     def _get_components(self, url):
         rv = []
-        url_parts = urlparse.urlsplit(url)
+        url_parts = urlsplit(url)
         variant = ""
         if url_parts.query:
             variant += "?" + url_parts.query
@@ -103,7 +103,7 @@
                             continue
                         url = test.url
                         if query or fragment:
-                            parsed = urlparse.urlparse(url)
+                            parsed = urlparse(url)
                             if ((query and query != parsed.query) or
                                 (fragment and fragment != parsed.fragment)):
                                 continue
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestupdate.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestupdate.py
index 86ac55f..452c583d 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/manifestupdate.py
@@ -1,7 +1,7 @@
 from __future__ import print_function
 import itertools
 import os
-import urlparse
+from six.moves.urllib.parse import urljoin
 from collections import namedtuple, defaultdict
 from math import ceil
 
@@ -114,8 +114,8 @@
 
     @property
     def url(self):
-        return urlparse.urljoin(self.url_base,
-                                "/".join(self.test_path.split(os.path.sep)))
+        return urljoin(self.url_base,
+                       "/".join(self.test_path.split(os.path.sep)))
 
     def set_lsan(self, run_info, result):
         """Set the result of the test in a particular run
@@ -195,7 +195,7 @@
     @property
     def id(self):
         """The id of the test represented by this TestNode"""
-        return urlparse.urljoin(self.parent.url, self.name)
+        return urljoin(self.parent.url, self.name)
 
     def disabled(self, run_info):
         """Boolean indicating whether this test is disabled when run in an
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/metadata.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/metadata.py
index b951ea5..253ab8e 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/metadata.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/metadata.py
@@ -8,12 +8,12 @@
 
 from mozlog import structuredlog
 
-import manifestupdate
-import testloader
-import wptmanifest
-import wpttest
-from expected import expected_path
-from vcs import git
+from . import manifestupdate
+from . import testloader
+from . import wptmanifest
+from . import wpttest
+from .expected import expected_path
+from .vcs import git
 manifest = None  # Module that will be imported relative to test_root
 manifestitem = None
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
index 04d4a32..7b9bbf3 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testloader.py
@@ -1,14 +1,14 @@
 import hashlib
 import os
-import urlparse
+from six.moves.urllib.parse import urlsplit
 from abc import ABCMeta, abstractmethod
-from Queue import Empty
+from six.moves.queue import Empty
 from collections import defaultdict, deque
 from multiprocessing import Queue
 
-import manifestinclude
-import manifestexpected
-import wpttest
+from . import manifestinclude
+from . import manifestexpected
+from . import wpttest
 from mozlog import structured
 
 manifest = None
@@ -348,7 +348,7 @@
         depth = kwargs.get("depth")
         if depth is True or depth == 0:
             depth = None
-        path = urlparse.urlsplit(test.url).path.split("/")[1:-1][:depth]
+        path = urlsplit(test.url).path.split("/")[1:-1][:depth]
         rv = path != state.get("prev_path")
         state["prev_path"] = path
         return rv
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testrunner.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testrunner.py
index 02ea2ce5..9228af6 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testrunner.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/testrunner.py
@@ -3,7 +3,7 @@
 import multiprocessing
 import threading
 import traceback
-from Queue import Empty
+from six.moves.queue import Empty
 from collections import namedtuple
 from multiprocessing import Process, current_process, Queue
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/__init__.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/__init__.py
index 9ff3e69..2626183 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/__init__.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/__init__.py
@@ -4,7 +4,7 @@
 
 from .. import wptcommandline
 
-from update import WPTUpdate
+from .update import WPTUpdate
 
 def remove_logging_args(args):
     """Take logging args out of the dictionary of command line arguments so
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/metadata.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/metadata.py
index 5c42fa3..d7e8ba2 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/metadata.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/metadata.py
@@ -2,7 +2,7 @@
 
 from .. import metadata, products
 
-from base import Step, StepRunner
+from .base import Step, StepRunner
 
 
 class GetUpdatePropertyList(Step):
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/state.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/state.py
index ad58513a..64dbf11 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/state.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/state.py
@@ -1,5 +1,5 @@
 import os
-import cPickle as pickle
+from six.moves import cPickle as pickle  # noqa: N813
 
 here = os.path.abspath(os.path.split(__file__)[0])
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/sync.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/sync.py
index c2d0bfa7..0d75a12 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/sync.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/sync.py
@@ -5,8 +5,8 @@
 import sys
 import uuid
 
-from base import Step, StepRunner
-from tree import Commit
+from .base import Step, StepRunner
+from .tree import Commit
 
 here = os.path.abspath(os.path.split(__file__)[0])
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/update.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/update.py
index fa0909b3..a0f4237 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/update.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/update/update.py
@@ -1,12 +1,12 @@
 import os
 import sys
 
-from metadata import MetadataUpdateRunner
-from sync import SyncFromUpstreamRunner
-from tree import GitTree, HgTree, NoVCSTree
+from .metadata import MetadataUpdateRunner
+from .sync import SyncFromUpstreamRunner
+from .tree import GitTree, HgTree, NoVCSTree
 
-from base import Step, StepRunner, exit_clean, exit_unclean
-from state import SavedState, UnsavedState
+from .base import Step, StepRunner, exit_clean, exit_unclean
+from .state import SavedState, UnsavedState
 
 def setup_paths(sync_path):
     sys.path.insert(0, os.path.abspath(sync_path))
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptcommandline.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptcommandline.py
index fef246d..080b1c6 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptcommandline.py
@@ -6,9 +6,9 @@
 from distutils.spawn import find_executable
 from datetime import timedelta
 
-import config
-import wpttest
-from formatters import chromium, wptreport, wptscreenshot
+from . import config
+from . import wpttest
+from .formatters import chromium, wptreport, wptscreenshot
 
 def abs_path(path):
     return os.path.abspath(os.path.expanduser(path))
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptlogging.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptlogging.py
index ac31181..9e3ff545 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptlogging.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptlogging.py
@@ -1,7 +1,7 @@
 import logging
 import sys
 import threading
-from StringIO import StringIO
+from six import StringIO
 from multiprocessing import Queue
 
 from mozlog import commandline, stdadapter, set_default_logger
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/__init__.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/__init__.py
index 8985b5a..e354d5f 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/__init__.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/__init__.py
@@ -1,5 +1,5 @@
 # flake8: noqa (not ideal, but nicer than adding noqa: F401 to every line!)
-from serializer import serialize
-from parser import parse
-from backends.static import compile as compile_static
-from backends.conditional import compile as compile_condition
+from .serializer import serialize
+from .parser import parse
+from .backends.static import compile as compile_static
+from .backends.conditional import compile as compile_condition
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
index 9e0ff029..e6c2e5b 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
@@ -14,12 +14,12 @@
 
 from __future__ import unicode_literals
 
-from cStringIO import StringIO
+from six.moves import cStringIO as StringIO
 
-from node import (AtomNode, BinaryExpressionNode, BinaryOperatorNode,
-                  ConditionalNode, DataNode, IndexNode, KeyValueNode, ListNode,
-                  NumberNode, StringNode, UnaryExpressionNode,
-                  UnaryOperatorNode, ValueNode, VariableNode)
+from .node import (AtomNode, BinaryExpressionNode, BinaryOperatorNode,
+                   ConditionalNode, DataNode, IndexNode, KeyValueNode, ListNode,
+                   NumberNode, StringNode, UnaryExpressionNode,
+                   UnaryOperatorNode, ValueNode, VariableNode)
 
 
 class ParseError(Exception):
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
index a7e0131..e474912 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
@@ -1,7 +1,7 @@
-from node import NodeVisitor, ValueNode, ListNode, BinaryExpressionNode
-from parser import atoms, precedence
+from .node import NodeVisitor, ValueNode, ListNode, BinaryExpressionNode
+from .parser import atoms, precedence
 
-atom_names = {v:"@%s" % k for (k,v) in atoms.iteritems()}
+atom_names = {v:"@%s" % k for (k,v) in atoms.items()}
 
 named_escapes = set(["\a", "\b", "\f", "\n", "\r", "\t", "\v"])
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
index 98b54dc1..a2a7dad 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
@@ -1,6 +1,6 @@
 import unittest
 
-from cStringIO import StringIO
+from six.moves import cStringIO as StringIO
 
 from .. import parser
 
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
index a64ce0c..e0fb855 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
@@ -1,9 +1,6 @@
-import sys
-import os
 import unittest
 
-sys.path.insert(0, os.path.abspath(".."))
-from cStringIO import StringIO
+from six.moves import cStringIO as StringIO
 
 from .. import parser
 from ..parser import token_types
diff --git a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
index 6a4fa4f..c2279ea 100644
--- a/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
+++ b/third_party/blink/web_tests/external/wpt/tools/wptrunner/wptrunner/wpttest.py
@@ -1,9 +1,9 @@
 import os
 import subprocess
-import urlparse
+from six.moves.urllib.parse import urljoin
 from collections import defaultdict
 
-from wptmanifest.parser import atoms
+from .wptmanifest.parser import atoms
 
 atom_reset = atoms["Reset"]
 enabled_tests = set(["testharness", "reftest", "wdspec"])
@@ -473,11 +473,11 @@
                 values = {}
             for key, data in value:
                 if len(key) == 3:
-                    key[0] = urlparse.urljoin(self.url, key[0])
-                    key[1] = urlparse.urljoin(self.url, key[1])
+                    key[0] = urljoin(self.url, key[0])
+                    key[1] = urljoin(self.url, key[1])
                 else:
                     # Key is just a relative url to a ref
-                    key = urlparse.urljoin(self.url, key)
+                    key = urljoin(self.url, key)
                 values[key] = data
         return values
 
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id-expected.txt b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id-expected.txt
index e2bcf02..d7f04467 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id-expected.txt
@@ -1,7 +1,7 @@
 This is a testharness.js-based test.
 PASS DTLS client uses odd data channel IDs
 PASS DTLS server uses even data channel IDs
-FAIL In-band negotiation with a specific ID should not be allowed assert_unreached: Channel established with same ID using negotiated=false Reached unreachable code
-FAIL Odd/even role should not be violated when mixing with negotiated channels assert_equals: Channel id must be null before DTLS role has been determined expected (object) null but got (number) 0
+FAIL In-band negotiation with a specific ID should not work assert_equals: expected (object) null but got (number) 42
+PASS Odd/even role should not be violated when mixing with negotiated channels
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id.html b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id.html
index 4c16547..0cf01976 100644
--- a/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id.html
+++ b/third_party/blink/web_tests/external/wpt/webrtc/RTCDataChannel-id.html
@@ -82,11 +82,10 @@
 }, 'DTLS server uses even data channel IDs');
 
 /*
-  Check if the implementation allows using in-band negotiated channels with a specific ID (which
-  is now a spec violation).
+  Checks that the id is ignored if "negotiated" is false.
+  See section 6.1, createDataChannel step 13.
  */
 promise_test(async (t) => {
-  const resolver = new Resolver();
   const pc1 = new RTCPeerConnection();
   const pc2 = new RTCPeerConnection();
   t.add_cleanup(() => pc1.close());
@@ -104,17 +103,18 @@
     negotiated: false,
     id: 42
   });
-  dc2.onmessage = t.step_func(() => {
-    assert_unreached('Channel established with same ID using negotiated=false');
-  });
+  // ID should be null prior to negotiation.
+  assert_equals(dc1.id, null);
+  assert_equals(dc2.id, null);
 
   exchangeIceCandidates(pc1, pc2);
   await doSignalingHandshake(pc1, pc2);
-
-  // Wait a bit to ensure the 'message' event does NOT fire
-  t.step_timeout(() => resolver.resolve(), 500);
-  await resolver;
-}, 'In-band negotiation with a specific ID should not be allowed');
+  // We should now have 2 datachannels with different IDs.
+  // At least one of the datachannels should not be 42.
+  // If one has the value 42, it's an accident; if both have,
+  // they are the same datachannel, and it's a bug.
+  assert_false(dc1.id == 42 && dc2.id == 42);
+}, 'In-band negotiation with a specific ID should not work');
 
 /*
   Check if the implementation still follows the odd/even role correctly if we annoy it with
@@ -149,7 +149,7 @@
       negotiated: true,
       id: id,
     });
-    assert_equals(dc.id, null, 'Channel id must be null before DTLS role has been determined');
+    assert_equals(dc.id, id, 'Channel id must be set before DTLS role has been determined when negotiated is true');
     negotiatedDcs.push([dc, id]);
     ids.add(dc.id, `Channel ID ${dc.id} should be unique`);
   }
diff --git a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-options-credentials.html b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-options-credentials.html
index 34f2239..03736cbb 100644
--- a/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-options-credentials.html
+++ b/third_party/blink/web_tests/external/wpt/workers/modules/dedicated-worker-options-credentials.html
@@ -1,5 +1,6 @@
 <!DOCTYPE html>
 <title>DedicatedWorker: WorkerOptions 'credentials'</title>
+<meta name="timeout" content="long">
 <script src="/resources/testharness.js"></script>
 <script src="/resources/testharnessreport.js"></script>
 <script src="/common/get-host-info.sub.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/xhr/abort-during-upload-expected.txt b/third_party/blink/web_tests/external/wpt/xhr/abort-during-upload-expected.txt
deleted file mode 100644
index 237ed14..0000000
--- a/third_party/blink/web_tests/external/wpt/xhr/abort-during-upload-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL XMLHttpRequest: abort() while sending data assert_equals: expected "upload.loadstart(0,9999,true)" but got "upload.loadstart(0,0,false)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/xhr/event-error-order.sub-expected.txt b/third_party/blink/web_tests/external/wpt/xhr/event-error-order.sub-expected.txt
deleted file mode 100644
index 2187b4e..0000000
--- a/third_party/blink/web_tests/external/wpt/xhr/event-error-order.sub-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL XMLHttpRequest: event - error (order of events) assert_equals: expected "upload.loadstart(0,12,true)" but got "upload.loadstart(0,0,false)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/xhr/event-loadstart-upload-expected.txt b/third_party/blink/web_tests/external/wpt/xhr/event-loadstart-upload-expected.txt
deleted file mode 100644
index 10e17a7..0000000
--- a/third_party/blink/web_tests/external/wpt/xhr/event-loadstart-upload-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL XMLHttpRequest: The send() method: Fire a progress event named loadstart on upload object (synchronous flag is unset) assert_equals: upload.onloadstart: event.total expected 7 but got 0
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/xhr/event-timeout-order-expected.txt b/third_party/blink/web_tests/external/wpt/xhr/event-timeout-order-expected.txt
deleted file mode 100644
index 6aa7110..0000000
--- a/third_party/blink/web_tests/external/wpt/xhr/event-timeout-order-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL XMLHttpRequest: event - timeout (order of events) assert_equals: expected "upload.loadstart(0,12,true)" but got "upload.loadstart(0,0,false)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/xhr/send-response-event-order-expected.txt b/third_party/blink/web_tests/external/wpt/xhr/send-response-event-order-expected.txt
deleted file mode 100644
index 4aa45e1c..0000000
--- a/third_party/blink/web_tests/external/wpt/xhr/send-response-event-order-expected.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-This is a testharness.js-based test.
-FAIL XMLHttpRequest: The send() method: event order when synchronous flag is unset assert_equals: expected "upload.loadstart(0,12,true)" but got "upload.loadstart(0,0,false)"
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/fast/forms/calendar-picker/japanese-era-names.html b/third_party/blink/web_tests/fast/forms/calendar-picker/japanese-era-names.html
index 3a9f4a63..e6d63a1 100644
--- a/third_party/blink/web_tests/fast/forms/calendar-picker/japanese-era-names.html
+++ b/third_party/blink/web_tests/fast/forms/calendar-picker/japanese-era-names.html
@@ -17,13 +17,16 @@
   let pw = popupWindow;
   const NEN = '\u5e74';
   const GANNEN = '\u5143\u5e74';
+  const REIWA = '\u4ee4\u548c';
   const HEISEI = '\u5e73\u6210';
   const SYOUWA = '\u662d\u548c';
   const TAISYOU = '\u5927\u6b63';
   const MEIJI = '\u660e\u6cbb';
   const JAN = 0, APR = 3, MAY = 4, JUL = 6, AUG = 7, DEC = 11;
-  assert_equals(pw.formatJapaneseImperialEra(2117, JAN), '');
-  assert_equals(pw.formatJapaneseImperialEra(2019, MAY), '');
+  assert_equals(pw.formatJapaneseImperialEra(2118, JAN), '');
+  assert_equals(pw.formatJapaneseImperialEra(2117, JAN), `(${REIWA}99${NEN})`);
+  assert_equals(pw.formatJapaneseImperialEra(2020, JAN), `(${REIWA}2${NEN})`);
+  assert_equals(pw.formatJapaneseImperialEra(2019, MAY), `(${REIWA}${GANNEN})`);
   assert_equals(pw.formatJapaneseImperialEra(2019, APR), `(${HEISEI}31${NEN})`);
   assert_equals(pw.formatJapaneseImperialEra(1990, JAN), `(${HEISEI}2${NEN})`);
   assert_equals(pw.formatJapaneseImperialEra(1989, JAN), `(${HEISEI}${GANNEN})`);
diff --git a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png b/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
deleted file mode 100644
index a632452..0000000
--- a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.txt b/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.txt
deleted file mode 100644
index fa5ae9f..0000000
--- a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images-expected.txt
+++ /dev/null
@@ -1 +0,0 @@
-CONSOLE ERROR: Feature policy violation: unoptimized-lossless-images is not allowed in this document.
diff --git a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images.html b/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images.html
deleted file mode 100644
index f42833d..0000000
--- a/third_party/blink/web_tests/http/tests/images/feature-policy-unoptimized-lossless-images.html
+++ /dev/null
@@ -1,7 +0,0 @@
-<!DOCTYPE html>
-<style>
-body {
-  font: 10px Ahem;
-}
-</style>
-<body><iframe src="resources/frame-with-compression-test-images.html" allow="unoptimized-lossless-images 'none'" width="700" height="500"></iframe></body>
diff --git a/third_party/blink/web_tests/platform/linux/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png b/third_party/blink/web_tests/platform/linux/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
deleted file mode 100644
index a632452..0000000
--- a/third_party/blink/web_tests/platform/linux/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png b/third_party/blink/web_tests/platform/mac/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
deleted file mode 100644
index 0243b0e..0000000
--- a/third_party/blink/web_tests/platform/mac/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png b/third_party/blink/web_tests/platform/win/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
deleted file mode 100644
index 0243b0e..0000000
--- a/third_party/blink/web_tests/platform/win/http/tests/images/feature-policy-unoptimized-lossless-images-expected.png
+++ /dev/null
Binary files differ
diff --git a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
index 324358f4..d779f94 100644
--- a/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
+++ b/third_party/blink/web_tests/webexposed/feature-policy-features-expected.txt
@@ -34,7 +34,6 @@
 sync-script
 sync-xhr
 top-navigation
-unoptimized-lossless-images
 unoptimized-lossy-images
 unsized-media
 usb
diff --git a/third_party/harfbuzz-ng/BUILD.gn b/third_party/harfbuzz-ng/BUILD.gn
index d9d34e8..b295a83 100644
--- a/third_party/harfbuzz-ng/BUILD.gn
+++ b/third_party/harfbuzz-ng/BUILD.gn
@@ -70,6 +70,7 @@
       "src/src/hb-aat-ltag-table.hh",
       "src/src/hb-aat-map.cc",
       "src/src/hb-aat-map.hh",
+      "src/src/hb-algs.hh",
       "src/src/hb-array.hh",
       "src/src/hb-atomic.hh",
       "src/src/hb-blob.cc",
@@ -87,7 +88,7 @@
       "src/src/hb-cff2-interp-cs.hh",
       "src/src/hb-common.cc",
       "src/src/hb-debug.hh",
-      "src/src/hb-dsalgs.hh",
+      "src/src/hb-dispatch.hh",
       "src/src/hb-face.cc",
       "src/src/hb-face.hh",
       "src/src/hb-font.cc",
@@ -96,6 +97,7 @@
       "src/src/hb-icu.cc",
       "src/src/hb-map.cc",
       "src/src/hb-map.hh",
+      "src/src/hb-meta.hh",
       "src/src/hb-mutex.hh",
       "src/src/hb-object.hh",
       "src/src/hb-open-file.hh",
@@ -173,6 +175,8 @@
       "src/src/hb-ot-var-hvar-table.hh",
       "src/src/hb-ot-var-mvar-table.hh",
       "src/src/hb-ot-var.cc",
+      "src/src/hb-sanitize.hh",
+      "src/src/hb-serialize.hh",
       "src/src/hb-set-digest.hh",
       "src/src/hb-set.cc",
       "src/src/hb-set.hh",
@@ -248,20 +252,6 @@
       "//third_party/icu:icuuc",
     ]
 
-    # TODO(https://crbug.com/894354): Change this to is_mac to revert to
-    # CoreText AAT. Remove this backstop and the whole hb-coretext build clause
-    # here once we have reliably switched to HarfBuzz AAT for one stable cycle.
-    if (false) {
-      public += [ "src/src/hb-coretext.h" ]
-      sources += [ "src/src/hb-coretext.cc" ]
-      defines += [ "HAVE_CORETEXT" ]
-      libs = [
-        "CoreFoundation.framework",
-        "CoreGraphics.framework",
-        "CoreText.framework",
-      ]
-    }
-
     if (use_glib) {
       configs += [ "//build/config/linux:glib" ]
       public += [ "src/src/hb-glib.h" ]
diff --git a/third_party/harfbuzz-ng/README.chromium b/third_party/harfbuzz-ng/README.chromium
index 24f3e5c..a8b1c12 100644
--- a/third_party/harfbuzz-ng/README.chromium
+++ b/third_party/harfbuzz-ng/README.chromium
@@ -1,9 +1,9 @@
 Name: harfbuzz-ng
 Short Name: harfbuzz-ng
 URL: http://harfbuzz.org
-Version: 2.3.1-103
-Date: 20190327
-Revision: ec2a5dc859b03ceb92518aa992e4e9c053b30534
+Version: 2.4.0-272
+Date: 20190401
+Revision: f3aca6aa267f7687a0406c7c545aefb5eed300b2
 Security Critical: yes
 License: MIT
 License File: src/COPYING
diff --git a/third_party/harfbuzz-ng/roll-harfbuzz.sh b/third_party/harfbuzz-ng/roll-harfbuzz.sh
index 8f66c17..8a86a34 100755
--- a/third_party/harfbuzz-ng/roll-harfbuzz.sh
+++ b/third_party/harfbuzz-ng/roll-harfbuzz.sh
@@ -27,9 +27,11 @@
   previousrev &&
   ADDED_FILES=$(git -C third_party/harfbuzz-ng/src/ diff --diff-filter=A --name-only ${PREVIOUS_HARFBUZZ_REV} -- src/ | paste -s -d, -) &&
   DELETED_FILES=$(git -C third_party/harfbuzz-ng/src/ diff --diff-filter=D --name-only ${PREVIOUS_HARFBUZZ_REV} -- src/ | paste -s -d, -) &&
+  RENAMED_FILES=$(git -C third_party/harfbuzz-ng/src/ diff --diff-filter=R --name-only ${PREVIOUS_HARFBUZZ_REV} -- src/ | paste -s -d, -) &&
   if [ -n "$ADDED_FILES" ]; then echo "Added files detected: " $ADDED_FILES; fi &&
   if [ -n "$DELETED_FILES" ]; then echo "Deleted files detected" $DELETED_FILES; fi &&
-  if [ -n "$ADDED_FILES" ] || [ -n "$DELETED_FILES" ]; then echo -e "\nPlease update src/third_party/harfbuzz-ng/BUILD.gn before continuing."; fi
+  if [ -n "$RENAMED_FILES" ]; then echo "Renamed files detected" $RENAMED_FILES; fi &&
+  if [ -n "$ADDED_FILES" ] || [ -n "$DELETED_FILES" ] || [ -n "$RENAMED_FILES" ]; then echo -e "\nPlease update src/third_party/harfbuzz-ng/BUILD.gn before continuing."; fi
 }
 
 commit() {
diff --git a/third_party/libjingle_xmpp/task_runner/taskrunner.cc b/third_party/libjingle_xmpp/task_runner/taskrunner.cc
index 02b5184..a1d83ce 100644
--- a/third_party/libjingle_xmpp/task_runner/taskrunner.cc
+++ b/third_party/libjingle_xmpp/task_runner/taskrunner.cc
@@ -78,9 +78,7 @@
   }
   // Finally, remove nulls
   std::vector<Task *>::iterator it;
-  it = std::remove(tasks_.begin(),
-                   tasks_.end(),
-                   reinterpret_cast<Task *>(NULL));
+  it = std::remove(tasks_.begin(), tasks_.end(), static_cast<Task*>(NULL));
 
   tasks_.erase(it, tasks_.end());
   tasks_running_ = false;
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index f289ed1..2e9e178 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -4495,6 +4495,7 @@
   <int value="212" label="RFPH_POST_MESSAGE_INVALID_SOURCE_ORIGIN"/>
   <int value="213" label="INVALID_INITIATOR_ORIGIN"/>
   <int value="214" label="RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN"/>
+  <int value="215" label="RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION"/>
 </enum>
 
 <enum name="BadMessageReasonExtensions">
@@ -16249,7 +16250,7 @@
   <int value="333" label="EnableMediaRouter"/>
   <int value="334" label="DHEEnabled"/>
   <int value="335" label="CertificateTransparencyEnforcementDisabledForUrls"/>
-  <int value="336" label="DeviceLoginScreenAppInstallList"/>
+  <int value="336" label="DeviceLoginScreenExtensions"/>
   <int value="337" label="ArcBackupRestoreEnabled"/>
   <int value="338" label="NTPContentSuggestionsEnabled"/>
   <int value="339" label="WebRtcUdpPortRange"/>
@@ -22731,7 +22732,6 @@
   <int value="43" label="Hid"/>
   <int value="44" label="IdleDetection"/>
   <int value="45" label="UnoptimizedLossyImages"/>
-  <int value="46" label="UnoptimizedLosslessImages"/>
 </enum>
 
 <enum name="FeedbackSource">
@@ -32159,6 +32159,7 @@
   <int value="-1826649921" label="ContextualSuggestionsButton:disabled"/>
   <int value="-1821058653" label="enable-delay-agnostic-aec"/>
   <int value="-1818947212" label="OutOfBlinkCors:disabled"/>
+  <int value="-1818040592" label="InSessionPasswordChange:enabled"/>
   <int value="-1817209284" label="PayWithGoogleV1:enabled"/>
   <int value="-1816066138" label="CastAllowAllIPs:enabled"/>
   <int value="-1812579951" label="ContentSuggestionsCategoryRanker:enabled"/>
@@ -34371,6 +34372,7 @@
   <int value="1766676896" label="affiliation-based-matching:disabled"/>
   <int value="1767411597" label="DisallowUnsafeHttpDownloads:enabled"/>
   <int value="1768759000" label="AutofillProfileServerValidation:disabled"/>
+  <int value="1770531338" label="InSessionPasswordChange:disabled"/>
   <int value="1772454319" label="enable-storage-manager"/>
   <int value="1775475563" label="malware-interstitial-v3"/>
   <int value="1776475705" label="show-composited-layer-borders"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 301718b..622fc06d 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -54967,6 +54967,28 @@
   </summary>
 </histogram>
 
+<histogram
+    name="Memory.Experimental.UserLevelMemoryPressureSignal.RendererPrivateMemoryFootprintAfter"
+    units="MB" expires_after="2019-09-30">
+  <owner>keishi@chromium.org</owner>
+  <owner>tasak@chromium.org</owner>
+  <summary>
+    The renderer process' private memory footprint 10 seconds after a memory
+    pressure signal is generated.
+  </summary>
+</histogram>
+
+<histogram
+    name="Memory.Experimental.UserLevelMemoryPressureSignal.RendererPrivateMemoryFootprintBefore"
+    units="MB" expires_after="2019-09-30">
+  <owner>keishi@chromium.org</owner>
+  <owner>tasak@chromium.org</owner>
+  <summary>
+    The renderer process' private memory footprint right before a memory
+    pressure signal is generated.
+  </summary>
+</histogram>
+
 <histogram base="true" name="Memory.Experimental.Utility2" units="MB"
     expires_after="2019-12-31">
 <!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index 41a956e..b8c945c 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -1747,7 +1747,9 @@
       name_from != ax::mojom::NameFrom::kAttributeExplicitlyEmpty)
     return nullptr;
 
-  return obj->GetStringAttribute(ax::mojom::StringAttribute::kName).c_str();
+  obj->accessible_name_ =
+      obj->GetStringAttribute(ax::mojom::StringAttribute::kName);
+  return obj->accessible_name_.c_str();
 }
 
 const gchar* GetDescription(AtkObject* atk_object) {
@@ -3149,22 +3151,30 @@
 }
 
 void AXPlatformNodeAuraLinux::OnNameChanged() {
-  std::string name;
-  GetStringAttribute(ax::mojom::StringAttribute::kName, &name);
+  std::string name = GetStringAttribute(ax::mojom::StringAttribute::kName);
 
-  AtkPropertyValues property_values;
-  property_values.property_name = "accessible-name";
-  property_values.new_value = G_VALUE_INIT;
-  g_value_init(&property_values.new_value, G_TYPE_STRING);
-  g_value_set_string(&property_values.new_value, name.c_str());
-  g_signal_emit_by_name(G_OBJECT(atk_object_),
-                        "property-change::accessible-name", &property_values,
-                        nullptr);
+  std::string previous_accessible_name = accessible_name_;
+  // Calling atk_object_get_name will update the value of accessible_name_.
+  if (!g_strcmp0(atk_object_get_name(atk_object_),
+                 previous_accessible_name.c_str()))
+    return;
+
+  g_object_notify(G_OBJECT(atk_object_), "accessible-name");
+}
+
+void AXPlatformNodeAuraLinux::OnDocumentTitleChanged() {
+  DCHECK(atk_object_);
+  if (!g_active_top_level_frame)
+    return;
+
+  // We always want to notify on the top frame.
+  AXPlatformNodeAuraLinux* window =
+      AtkObjectToAXPlatformNodeAuraLinux(g_active_top_level_frame);
+  window->OnNameChanged();
 }
 
 void AXPlatformNodeAuraLinux::OnInvalidStatusChanged() {
   DCHECK(atk_object_);
-
   atk_object_notify_state_change(
       ATK_OBJECT(atk_object_), ATK_STATE_INVALID_ENTRY,
       GetData().GetInvalidState() != ax::mojom::InvalidState::kFalse);
@@ -3200,6 +3210,9 @@
       break;
     case ax::mojom::Event::kSelection:
       OnSelected();
+      // When changing tabs also fire a name changed event.
+      if (GetData().role == ax::mojom::Role::kTab)
+        OnDocumentTitleChanged();
       break;
     case ax::mojom::Event::kSelectedChildrenChanged:
       OnSelectedChildrenChanged();
@@ -3219,6 +3232,17 @@
     case ax::mojom::Event::kWindowDeactivated:
       OnWindowDeactivated();
       break;
+    case ax::mojom::Event::kLoadComplete:
+    case ax::mojom::Event::kDocumentTitleChanged:
+      // Sometimes, e.g. upon navigating away from the page, the tree is
+      // rebuilt rather than modified. The kDocumentTitleChanged event occurs
+      // prior to the rebuild and so is added on the previous root node. When
+      // the tree is rebuilt and the old node removed, the events on the old
+      // node are removed and no new kDocumentTitleChanged will be emitted. To
+      // ensure we still fire the event, though, we also pay attention to
+      // kLoadComplete.
+      OnDocumentTitleChanged();
+      break;
     default:
       break;
   }
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 89232f3..c447b482 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -93,6 +93,7 @@
   void OnNameChanged();
   void OnDescriptionChanged();
   void OnInvalidStatusChanged();
+  void OnDocumentTitleChanged();
 
   bool SupportsSelectionWithAtkSelection();
   bool SelectionAndFocusAreTheSame();
@@ -121,6 +122,8 @@
   bool HasSelection();
   gchar* GetSelection(int* start_offset, int* end_offset);
 
+  std::string accessible_name_;
+
  protected:
   // Offsets for the AtkText API are calculated in UTF-16 code point offsets,
   // but the ATK APIs want all offsets to be in "characters," which we
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 4182d91..a02d46d 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -1727,6 +1727,9 @@
         fileOperationManager, 'entries-changed',
         this.onEntriesChanged_.bind(this));
 
+    // Add a listener so we can scroll selected item into view.
+    this.addEventListener('focus', this.onFocus_.bind(this));
+
     this.addEventListener('click', (event) => {
       // Chromevox triggers |click| without switching focus, we force the focus
       // here so we can handle further keyboard/mouse events to expand/collapse
@@ -1921,6 +1924,17 @@
   }
 
   /**
+   * Invoked when an item in the tree gets focus.
+   * @param {!Event} e Event.
+   * @private
+   */
+  onFocus_(e) {
+    if (this.selectedItem && this.selectedItem.labelElement) {
+      this.selectedItem.labelElement.scrollIntoView({inline: 'start'});
+    }
+  }
+
+  /**
    * Select the item corresponding to the given entry.
    * @param {!DirectoryEntry|!FilesAppDirEntry} entry The directory entry to be
    *     selected. Can be a fake.
diff --git a/ui/file_manager/image_loader/piex/package.json b/ui/file_manager/image_loader/piex/package.json
index 299a2e5..2407672 100644
--- a/ui/file_manager/image_loader/piex/package.json
+++ b/ui/file_manager/image_loader/piex/package.json
@@ -11,7 +11,6 @@
     "piex": "git+https://android.googlesource.com/platform/external/piex"
   },
   "dependencies": {
-    "chalk": "^2.4.2",
     "commander": "^2.19.0",
     "http-server": "^0.11.1",
     "napa": "^3.0.0",
diff --git a/ui/file_manager/image_loader/piex/tests.js b/ui/file_manager/image_loader/piex/tests.js
index d44a3b2..4cd300a 100644
--- a/ui/file_manager/image_loader/piex/tests.js
+++ b/ui/file_manager/image_loader/piex/tests.js
@@ -11,14 +11,19 @@
   .option('-d, --debug', 'enable debug mode');
 
 program.on('--help', function help() {
-  const text = require('chalk');
   console.log('');
-  console.log(text.blue('  % ' + example));
+  console.log('  % ' + example);
   console.log('');
 });
 
+program.explain = () => {
+  return undefined != process.argv.find((element) => {
+    return element == '--help' || element == '-h';
+  });
+};
+
 program.parse(process.argv);
-if (process.argv.length < 3) {
+if (!program.args.length || program.explain()) {
   program.help();
   process.exit(1);
 }