diff --git a/AUTHORS b/AUTHORS
index d7f0a3d..d0e12c4 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -912,6 +912,7 @@
 BlackBerry Limited <*@blackberry.com>
 Canonical Limited <*@canonical.com>
 Code Aurora Forum <*@codeaurora.org>
+Collabora Limited <*@collabora.com>
 Comodo CA Limited
 Endless Mobile, Inc. <*@endlessm.com>
 Facebook, Inc. <*@fb.com>
diff --git a/DEPS b/DEPS
index 38887bd..40479be 100644
--- a/DEPS
+++ b/DEPS
@@ -74,11 +74,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': '46845d1c3af511ca3d2c561941b35ce0e56fba0b',
+  'skia_revision': '7035a8e797eba8ccccff057525d01cf02c1f2a02',
   # 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': 'c85ab812b52372829765afe2262e37a5f7ff5add',
+  'v8_revision': 'c431872866ad9df805408af459fb8c0cbf553068',
   # 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.
@@ -639,7 +639,7 @@
     Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + '1a8ed15c9c25f2b1ccd97149c94ea245ab982252',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '1aa285974b6b2c5d1afe44b3eafe08f4b80837ed', # commit position 20628
+    Var('webrtc_git') + '/src.git' + '@' + '019008bd93068df35e620a9cb84c33d37a5677d4', # commit position 20628
 
   'src/third_party/xdg-utils': {
       'url': Var('chromium_git') + '/chromium/deps/xdg-utils.git' + '@' + 'd80274d5869b17b8c9067a1022e4416ee7ed5e0d',
diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
index 67b8fd0..416e5a4 100644
--- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
+++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
@@ -638,11 +638,11 @@
           extras['log'] = 'true'
           extras[_EXTRA_TEST_LIST] = dev_test_list_json.name
           target = '%s/%s' % (test_package, junit4_runner_class)
-          kwargs = {}
+          timeout = 120
           if self._test_instance.wait_for_java_debugger:
-            kwargs['timeout'] = None
+            timeout = None
           test_list_run_output = dev.StartInstrumentation(
-              target, extras=extras, retries=0, **kwargs)
+              target, extras=extras, retries=0, timeout=timeout)
           if any(test_list_run_output):
             logging.error('Unexpected output while listing tests:')
             for line in test_list_run_output:
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
index 66e2efa7..8e62617 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/password/PasswordEntryEditor.java
@@ -28,7 +28,6 @@
 import android.view.ViewGroup;
 import android.view.WindowManager.LayoutParams;
 import android.widget.ImageButton;
-import android.widget.ImageView;
 import android.widget.TextView;
 
 import org.chromium.base.ApiCompatibilityUtils;
@@ -37,6 +36,7 @@
 import org.chromium.chrome.browser.PasswordManagerHandler.PasswordListObserver;
 import org.chromium.chrome.browser.PasswordUIView;
 import org.chromium.chrome.browser.sync.ProfileSyncService;
+import org.chromium.chrome.browser.widget.TintedImageButton;
 import org.chromium.components.sync.AndroidSyncSettings;
 import org.chromium.ui.text.SpanApplier;
 import org.chromium.ui.widget.Toast;
@@ -250,68 +250,60 @@
     }
 
     private void hookupCopyUsernameButton(View usernameView) {
-        final ImageButton copyUsernameButton =
-                (ImageButton) usernameView.findViewById(R.id.password_entry_editor_copy);
-        final ImageView copy_image = usernameView.findViewById(R.id.password_entry_editor_copy);
-        copy_image.setImageDrawable(
+        final TintedImageButton copyUsernameButton =
+                usernameView.findViewById(R.id.password_entry_editor_copy);
+        copyUsernameButton.setImageDrawable(
                 AppCompatResources.getDrawable(getActivity(), R.drawable.ic_content_copy_black));
 
         copyUsernameButton.setContentDescription(
                 getActivity().getString(R.string.password_entry_editor_copy_stored_username));
-        copyUsernameButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                ClipData clip = ClipData.newPlainText("username",
-                        getArguments().getString(SavePasswordsPreferences.PASSWORD_LIST_NAME));
-                mClipboard.setPrimaryClip(clip);
-                Toast.makeText(getActivity().getApplicationContext(),
-                             R.string.password_entry_editor_username_copied_into_clipboard,
-                             Toast.LENGTH_SHORT)
-                        .show();
-                RecordHistogram.recordEnumeratedHistogram(
-                        "PasswordManager.Android.PasswordCredentialEntry.Username",
-                        USERNAME_ACTION_COPIED, USERNAME_ACTION_BOUNDARY);
-            }
+        copyUsernameButton.setOnClickListener(v -> {
+            ClipData clip = ClipData.newPlainText("username",
+                    getArguments().getString(SavePasswordsPreferences.PASSWORD_LIST_NAME));
+            mClipboard.setPrimaryClip(clip);
+            Toast.makeText(getActivity().getApplicationContext(),
+                         R.string.password_entry_editor_username_copied_into_clipboard,
+                         Toast.LENGTH_SHORT)
+                    .show();
+            RecordHistogram.recordEnumeratedHistogram(
+                    "PasswordManager.Android.PasswordCredentialEntry.Username",
+                    USERNAME_ACTION_COPIED, USERNAME_ACTION_BOUNDARY);
         });
     }
 
     private void hookupCopySiteButton(View siteView) {
-        final ImageButton copySiteButton =
-                (ImageButton) siteView.findViewById(R.id.password_entry_editor_copy);
+        final TintedImageButton copySiteButton =
+                siteView.findViewById(R.id.password_entry_editor_copy);
         copySiteButton.setContentDescription(
                 getActivity().getString(R.string.password_entry_editor_copy_stored_site));
-        final ImageView copy_image = siteView.findViewById(R.id.password_entry_editor_copy);
-        copy_image.setImageDrawable(
+        copySiteButton.setImageDrawable(
                 AppCompatResources.getDrawable(getActivity(), R.drawable.ic_content_copy_black));
 
-        copySiteButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                ClipData clip = ClipData.newPlainText("site",
-                        getArguments().getString(SavePasswordsPreferences.PASSWORD_LIST_URL));
-                mClipboard.setPrimaryClip(clip);
-                Toast.makeText(getActivity().getApplicationContext(),
-                             R.string.password_entry_editor_site_copied_into_clipboard,
-                             Toast.LENGTH_SHORT)
-                        .show();
-                if (mException) {
-                    RecordHistogram.recordEnumeratedHistogram(
-                            "PasswordManager.Android.PasswordExceptionEntry.Website",
-                            WEBSITE_ACTION_COPIED, WEBSITE_ACTION_BOUNDARY);
-                } else {
-                    RecordHistogram.recordEnumeratedHistogram(
-                            "PasswordManager.Android.PasswordCredentialEntry.Website",
-                            WEBSITE_ACTION_COPIED, WEBSITE_ACTION_BOUNDARY);
-                }
+        copySiteButton.setOnClickListener(v -> {
+            ClipData clip = ClipData.newPlainText(
+                    "site", getArguments().getString(SavePasswordsPreferences.PASSWORD_LIST_URL));
+            mClipboard.setPrimaryClip(clip);
+            Toast.makeText(getActivity().getApplicationContext(),
+                         R.string.password_entry_editor_site_copied_into_clipboard,
+                         Toast.LENGTH_SHORT)
+                    .show();
+            if (mException) {
+                RecordHistogram.recordEnumeratedHistogram(
+                        "PasswordManager.Android.PasswordExceptionEntry.Website",
+                        WEBSITE_ACTION_COPIED, WEBSITE_ACTION_BOUNDARY);
+            } else {
+                RecordHistogram.recordEnumeratedHistogram(
+                        "PasswordManager.Android.PasswordCredentialEntry.Website",
+                        WEBSITE_ACTION_COPIED, WEBSITE_ACTION_BOUNDARY);
             }
         });
     }
 
     private void changeHowPasswordIsDisplayed(
             int visibilityIcon, int inputType, @StringRes int annotation) {
-        TextView passwordView = (TextView) mView.findViewById(R.id.password_entry_editor_password);
+        TextView passwordView = mView.findViewById(R.id.password_entry_editor_password);
         ImageButton viewPasswordButton =
-                (ImageButton) mView.findViewById(R.id.password_entry_editor_view_password);
+                mView.findViewById(R.id.password_entry_editor_view_password);
         passwordView.setText(mExtras.getString(SavePasswordsPreferences.PASSWORD_LIST_PASSWORD));
         passwordView.setInputType(inputType);
         viewPasswordButton.setImageResource(visibilityIcon);
@@ -354,54 +346,43 @@
     }
 
     private void hookupPasswordButtons() {
-        final ImageButton copyPasswordButton =
-                (ImageButton) mView.findViewById(R.id.password_entry_editor_copy_password);
-        final ImageButton viewPasswordButton =
-                (ImageButton) mView.findViewById(R.id.password_entry_editor_view_password);
-        final ImageView copy_password =
+        final TintedImageButton copyPasswordButton =
                 mView.findViewById(R.id.password_entry_editor_copy_password);
-        copy_password.setImageDrawable(
+        final ImageButton viewPasswordButton =
+                mView.findViewById(R.id.password_entry_editor_view_password);
+        copyPasswordButton.setImageDrawable(
                 AppCompatResources.getDrawable(getActivity(), R.drawable.ic_content_copy_black));
-        copyPasswordButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                if (!ReauthenticationManager.isScreenLockSetUp(
-                            getActivity().getApplicationContext())) {
-                    Toast.makeText(getActivity().getApplicationContext(),
-                                 R.string.password_entry_editor_set_lock_screen, Toast.LENGTH_LONG)
-                            .show();
-                } else if (ReauthenticationManager.authenticationStillValid()) {
-                    copyPassword();
-                } else {
-                    mCopyButtonPressed = true;
-                    ReauthenticationManager.displayReauthenticationFragment(
-                            R.string.lockscreen_description_copy,
-                            R.id.password_entry_editor_interactive, getFragmentManager());
-                }
+        copyPasswordButton.setOnClickListener(v -> {
+            if (!ReauthenticationManager.isScreenLockSetUp(getActivity().getApplicationContext())) {
+                Toast.makeText(getActivity().getApplicationContext(),
+                             R.string.password_entry_editor_set_lock_screen, Toast.LENGTH_LONG)
+                        .show();
+            } else if (ReauthenticationManager.authenticationStillValid()) {
+                copyPassword();
+            } else {
+                mCopyButtonPressed = true;
+                ReauthenticationManager.displayReauthenticationFragment(
+                        R.string.lockscreen_description_copy,
+                        R.id.password_entry_editor_interactive, getFragmentManager());
             }
         });
-        viewPasswordButton.setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                TextView passwordView =
-                        (TextView) mView.findViewById(R.id.password_entry_editor_password);
-                if (!ReauthenticationManager.isScreenLockSetUp(
-                            getActivity().getApplicationContext())) {
-                    Toast.makeText(getActivity().getApplicationContext(),
-                                 R.string.password_entry_editor_set_lock_screen, Toast.LENGTH_LONG)
-                            .show();
-                } else if ((passwordView.getInputType()
-                                   & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
-                        == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
-                    hidePassword();
-                } else if (ReauthenticationManager.authenticationStillValid()) {
-                    displayPassword();
-                } else {
-                    mViewButtonPressed = true;
-                    ReauthenticationManager.displayReauthenticationFragment(
-                            R.string.lockscreen_description_view,
-                            R.id.password_entry_editor_interactive, getFragmentManager());
-                }
+        viewPasswordButton.setOnClickListener(v -> {
+            TextView passwordView = mView.findViewById(R.id.password_entry_editor_password);
+            if (!ReauthenticationManager.isScreenLockSetUp(getActivity().getApplicationContext())) {
+                Toast.makeText(getActivity().getApplicationContext(),
+                             R.string.password_entry_editor_set_lock_screen, Toast.LENGTH_LONG)
+                        .show();
+            } else if ((passwordView.getInputType()
+                               & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD)
+                    == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) {
+                hidePassword();
+            } else if (ReauthenticationManager.authenticationStillValid()) {
+                displayPassword();
+            } else {
+                mViewButtonPressed = true;
+                ReauthenticationManager.displayReauthenticationFragment(
+                        R.string.lockscreen_description_view,
+                        R.id.password_entry_editor_interactive, getFragmentManager());
             }
         });
     }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
index 25ab8c5..375b641 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ExampleUiCaptureTest.java
@@ -55,8 +55,8 @@
     @Feature({"UiCatalogue"})
     @ScreenShooter.Directory("TabSwitcher")
     public void testCaptureTabSwitcher() throws IOException, InterruptedException {
-        mScreenShooter.shoot("NTP");
+        mScreenShooter.shoot("NTP", ScreenShooter.TagsEnum.UiCatalogueExample);
         Espresso.onView(ViewMatchers.withId(R.id.tab_switcher_button)).perform(ViewActions.click());
-        mScreenShooter.shoot("Tab switcher");
+        mScreenShooter.shoot("Tab switcher", ScreenShooter.TagsEnum.UiCatalogueExample);
     }
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/TileGridLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/TileGridLayoutTest.java
index 2c28fe8..db0c1f31 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/TileGridLayoutTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/TileGridLayoutTest.java
@@ -118,7 +118,7 @@
     public void testHomePageIsMovedToFirstPositionWhenMultipleRowsExist() throws Exception {
         // Contructs a home page tile in the second row. Assuming a row contains <= 6 tiles.
         NewTabPage ntp =
-                setUpFakeDataToShowOnNtp(/*homePagePosition=*/7, FAKE_MOST_VISITED_URLS.length);
+                setUpFakeDataToShowOnNtp(/* homePagePosition = */ 7, FAKE_MOST_VISITED_URLS.length);
         TileGridLayout grid = getTileGridLayout(ntp);
         TileView homePageTileView = (TileView) grid.getChildAt(7);
 
@@ -130,7 +130,8 @@
     @SmallTest
     @Feature({"NewTabPage"})
     public void testHomePageRemainsAsLastElementInOnlyRow() throws Exception {
-        NewTabPage ntp = setUpFakeDataToShowOnNtp(/*homePagePosition=*/4, /*suggestionsCount=*/4);
+        NewTabPage ntp =
+                setUpFakeDataToShowOnNtp(/* homePagePosition = */ 4, /* suggestionCount = */ 4);
         TileGridLayout grid = getTileGridLayout(ntp);
         TileView homePageTileView = (TileView) grid.getChildAt(4);
         grid.setMaxColumns(4);
@@ -147,7 +148,8 @@
     @SmallTest
     @Feature({"NewTabPage"})
     public void testHomePageKeepsPositionInOnlyRow() throws Exception {
-        NewTabPage ntp = setUpFakeDataToShowOnNtp(/*homePagePosition=*/2, /*suggestionsCount=*/3);
+        NewTabPage ntp =
+                setUpFakeDataToShowOnNtp(/* homePagePosition = */ 2, /* suggestionCount = */ 3);
         TileGridLayout grid = getTileGridLayout(ntp);
 
         // The home page tile stays at the third position as we have only one row.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java b/chrome/android/javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java
index 38d02f4..25dad71b9 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/test/ScreenShooter.java
@@ -5,7 +5,6 @@
 package org.chromium.chrome.browser.test;
 
 import static org.hamcrest.Matchers.isIn;
-import static org.hamcrest.Matchers.not;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -18,11 +17,13 @@
 import android.support.test.InstrumentationRegistry;
 import android.support.test.uiautomator.UiDevice;
 
+import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 import org.junit.rules.TestWatcher;
 import org.junit.runner.Description;
 
+import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.ChromeVersionInfo;
 
 import java.io.File;
@@ -33,8 +34,10 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 import java.text.DateFormat;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 
@@ -50,16 +53,20 @@
  * (i.e. no directory created at this level), and {@code test_directory} defaults to the name of
  * the individual test. {@code random} is a random value to make the filenames unique.
  * <p>
- * The JSON file contains tags and metadata describing the screenshot. The tags are fields such as
- * the shot name or the test name that may be used to filter screenshot sets in the Clank UI
- * Catalogue viewer. The metadata fields contain data (such as the exact time the shot was
- * taken) that are less suitable for filtering screenshot sets, but nevertheless may be of
- * interest to people viewing the screenshots.
+ * The JSON file contains three categories of data:
+ * <dl>
+ * <dt>filters</dt><dd><dd>System defined key/value pairs (e.g. the name of the test) that are
+ *                          available for filtering test sets in the UiCatalogue</dd>
+ * <dt>tags</dt><dd>User defined strings that further define the test. Tags include all features of
+ *                  the test (as defined by the &#064Feature annotation), and all the tags provided
+ *                  as arguments to the the {@code shoot} call</dd>
+ * <dt>metadata</dt><dd>Other metadata (e.g. the exact time at which the test was run) that is not
+ *                      suitable for filtering</dd>
+ * </dl>
  * <p>
  * A simple example:
  * <p>
  * <pre>
- * {@code
  * &#064;RunWith(ChromeJUnit4ClassRunner.class)
  * &#064;CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
  * &#064;Restriction(RESTRICTION_TYPE_PHONE) // Tab switcher button only exists on phones.
@@ -97,29 +104,38 @@
     private static final String IMAGE_SUFFIX = ".png";
     private static final String JSON_SUFFIX = ".json";
 
-    // Default tags
-    private static final String TEST_CLASS_TAG = "Test Class";
-    private static final String TEST_METHOD_TAG = "Test Method";
-    private static final String SCREENSHOT_NAME_TAG = "Screenshot Name";
-    private static final String DEVICE_MODEL_TAG = "Device Model";
-    private static final String DISPLAY_SIZE_TAG = "Display Size";
-    private static final String ORIENTATION_TAG = "Orientation";
-    private static final String ANDROID_VERSION_TAG = "Android Version";
-    private static final String CHROME_VERSION_TAG = "Chrome Version";
-    private static final String CHROME_CHANNEL_TAG = "Chrome Channel";
-    private static final String LOCALE_TAG = "Locale";
-    // UPLOAD_TIME_TAG is reserved for use by the Clank UI Catalogue uploader.
-    private static final String UPLOAD_TIME_TAG = "Upload Time";
+    // Filter keys
+    private static final String TEST_CLASS_FILTER = "Test Class";
+    private static final String TEST_METHOD_FILTER = "Test Method";
+    private static final String SCREENSHOT_NAME_FILTER = "Screenshot Name";
+    private static final String DEVICE_MODEL_FILTER = "Device Model";
+    private static final String DISPLAY_SIZE_FILTER = "Display Size";
+    private static final String ORIENTATION_FILTER = "Orientation";
+    private static final String ANDROID_VERSION_FILTER = "Android Version";
+    private static final String CHROME_VERSION_FILTER = "Chrome Version";
+    private static final String CHROME_CHANNEL_FILTER = "Chrome Channel";
+    private static final String LOCALE_FILTER = "Locale";
+    // UPLOAD_TIME_FILTER is reserved for use by the Clank UI Catalogue uploader.
+    private static final String UPLOAD_TIME_FILTER = "Upload Time";
 
     private final UiDevice mDevice;
     private final String mBaseDir;
     private File mDir;
     private String mTestClassName;
     private String mTestMethodName;
-    private static final String[] DEFAULT_TAGS = {TEST_CLASS_TAG, TEST_METHOD_TAG,
-            SCREENSHOT_NAME_TAG, DEVICE_MODEL_TAG, DISPLAY_SIZE_TAG, ORIENTATION_TAG,
-            ANDROID_VERSION_TAG, CHROME_VERSION_TAG, CHROME_CHANNEL_TAG, LOCALE_TAG,
-            UPLOAD_TIME_TAG};
+    private static final String[] FILTERS = {TEST_CLASS_FILTER, TEST_METHOD_FILTER,
+            SCREENSHOT_NAME_FILTER, DEVICE_MODEL_FILTER, DISPLAY_SIZE_FILTER, ORIENTATION_FILTER,
+            ANDROID_VERSION_FILTER, CHROME_VERSION_FILTER, CHROME_CHANNEL_FILTER, LOCALE_FILTER,
+            UPLOAD_TIME_FILTER};
+    private String[] mFeatures;
+
+    /**
+     * This Enum is a central list of all allowed tags. Please add to it if you need a new tag for
+     * your screenshots.
+     */
+    public enum TagsEnum {
+        UiCatalogueExample,
+    }
 
     @Retention(RetentionPolicy.RUNTIME)
     @Target({ElementType.TYPE, ElementType.METHOD})
@@ -149,22 +165,11 @@
                 : methodDirectoryAnnotation.value();
         if (!testMethodDir.isEmpty()) mDir = new File(mDir, testMethodDir);
         if (!mDir.exists()) assertTrue("Create screenshot directory", mDir.mkdirs());
+        mFeatures = d.getAnnotation(Feature.class).value();
     }
 
-    /**
-     * Take a screenshot and save it to a file, with tags and metadata in a JSON file
-     *
-     * @param shotName The name of this particular screenshot within this test.
-     */
-    public void shoot(String shotName) {
-        assertNotNull("ScreenShooter rule initialized", mDir);
-
-        Map<String, String> tags = new HashMap<>();
-        shoot(shotName, tags);
-    }
-
-    private static void setDefaultTag(Map<String, String> tags, String name, String value) {
-        assertThat("\"" + name + "\" is a known default tag", name, isIn(DEFAULT_TAGS));
+    private static void setFilterValue(Map<String, String> tags, String name, String value) {
+        assertThat("\"" + name + "\" is a known filter", name, isIn(FILTERS));
         tags.put(name, value);
     }
 
@@ -172,26 +177,25 @@
      * Take a screenshot and save it to a file, with tags and metadata in a JSON file
      *
      * @param shotName The name of this particular screenshot within this test.
-     * @param tags User defined tags, must not clash with default tags.
+     * @param tags User selected tags from {@link TagsEnum}.
      */
-    public void shoot(String shotName, Map<String, String> tags) {
-        for (String tag : tags.keySet()) {
-            assertThat("\"" + tag + "\" is not a default tag", tag, not(isIn(DEFAULT_TAGS)));
-        }
-        setDefaultTag(tags, TEST_CLASS_TAG, mTestClassName);
-        setDefaultTag(tags, TEST_METHOD_TAG, mTestMethodName);
-        setDefaultTag(tags, SCREENSHOT_NAME_TAG, shotName);
-        setDefaultTag(tags, DEVICE_MODEL_TAG, Build.MANUFACTURER + " " + Build.MODEL);
+    public void shoot(String shotName, TagsEnum... tags) {
+        assertNotNull("ScreenShooter rule initialized", mDir);
+        Map<String, String> filters = new HashMap<>();
+        setFilterValue(filters, TEST_CLASS_FILTER, mTestClassName);
+        setFilterValue(filters, TEST_METHOD_FILTER, mTestMethodName);
+        setFilterValue(filters, SCREENSHOT_NAME_FILTER, shotName);
+        setFilterValue(filters, DEVICE_MODEL_FILTER, Build.MANUFACTURER + " " + Build.MODEL);
         Point displaySize = mDevice.getDisplaySizeDp();
-        setDefaultTag(tags, DISPLAY_SIZE_TAG,
+        setFilterValue(filters, DISPLAY_SIZE_FILTER,
                 String.format(Locale.US, "%d X %d", Math.min(displaySize.x, displaySize.y),
                         Math.max(displaySize.x, displaySize.y)));
         int orientation =
                 InstrumentationRegistry.getContext().getResources().getConfiguration().orientation;
-        setDefaultTag(tags, ORIENTATION_TAG,
+        setFilterValue(filters, ORIENTATION_FILTER,
                 orientation == Configuration.ORIENTATION_LANDSCAPE ? "landscape" : "portrait");
-        setDefaultTag(tags, ANDROID_VERSION_TAG, Build.VERSION.RELEASE);
-        setDefaultTag(tags, CHROME_VERSION_TAG,
+        setFilterValue(filters, ANDROID_VERSION_FILTER, Build.VERSION.RELEASE);
+        setFilterValue(filters, CHROME_VERSION_FILTER,
                 Integer.toString(ChromeVersionInfo.getProductMajorVersion()));
         String channelName = "Unknown";
         if (ChromeVersionInfo.isLocalBuild()) {
@@ -208,8 +212,8 @@
         if (ChromeVersionInfo.isOfficialBuild()) {
             channelName = channelName + " Official";
         }
-        setDefaultTag(tags, CHROME_CHANNEL_TAG, channelName);
-        setDefaultTag(tags, LOCALE_TAG, Locale.getDefault().toString());
+        setFilterValue(filters, CHROME_CHANNEL_FILTER, channelName);
+        setFilterValue(filters, LOCALE_FILTER, Locale.getDefault().toString());
 
         Map<String, String> metadata = new HashMap<>();
         DateFormat formatter =
@@ -221,19 +225,27 @@
         try {
             File shotFile = File.createTempFile(shotName, IMAGE_SUFFIX, mDir);
             assertTrue("Screenshot " + shotName, mDevice.takeScreenshot(shotFile));
-            writeImageDescription(shotFile, tags, metadata);
+            writeImageDescription(shotFile, filters, tags, metadata);
         } catch (IOException e) {
             fail("Cannot create shot files " + e.toString());
         }
     }
 
-    private void writeImageDescription(File shotFile, Map<String, String> tags,
+    private void writeImageDescription(File shotFile, Map<String, String> filters, TagsEnum[] tags,
             Map<String, String> metadata) throws IOException {
         JSONObject imageDescription = new JSONObject();
         String shotFileName = shotFile.getName();
+        List<String> tagStrings = new ArrayList<>();
+        for (TagsEnum tag : tags) {
+            tagStrings.add(tag.toString());
+        }
+        for (String feature : mFeatures) {
+            tagStrings.add(feature + " Feature");
+        }
         try {
             imageDescription.put("location", shotFileName);
-            imageDescription.put("tags", new JSONObject(tags));
+            imageDescription.put("filters", new JSONObject(filters));
+            imageDescription.put("tags", new JSONArray(tagStrings));
             imageDescription.put("metadata", new JSONObject(metadata));
         } catch (JSONException e) {
             fail("JSON error " + e.toString());
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index e209ce9a..f955d43 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -828,6 +828,11 @@
     PrefRegistrySimple* registry) {
   registry->RegisterStringPref(prefs::kIsolateOrigins, std::string());
   registry->RegisterBooleanPref(prefs::kSitePerProcess, false);
+#if defined(OS_WIN)
+  // TODO(chrisha): Move this to chrome/browser/conflicts as we build the
+  // logic that responds to this pref.
+  registry->RegisterBooleanPref(prefs::kThirdPartyBlockingEnabled, true);
+#endif
 }
 
 // static
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index 460c2cd..8b8b7aa2 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -731,6 +731,11 @@
     prefs::kAbusiveExperienceInterventionEnforce,
     base::Value::Type::BOOLEAN },
 
+#if defined(OS_WIN)
+  { key::kThirdPartyBlockingEnabled,
+    prefs::kThirdPartyBlockingEnabled,
+    base::Value::Type::BOOLEAN },
+#endif
 };
 // clang-format on
 
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
index 67f0341..213e5a15 100644
--- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
+++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -242,9 +242,7 @@
         background_color);
 
     // Outdent the popup to factor in the shadow size.
-    int border_thickness = border->GetBorderThickness();
-    new_target_bounds.Inset(-border_thickness, -border_thickness,
-                            -border_thickness, -border_thickness);
+    new_target_bounds.Inset(-border->GetInsets());
 
     SetBackground(base::MakeUnique<views::BubbleBackground>(border.get()));
     SetBorder(std::move(border));
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc
index 4c1daa0..a80f848f 100644
--- a/chrome/common/pref_names.cc
+++ b/chrome/common/pref_names.cc
@@ -2547,4 +2547,10 @@
 // Boolean that specifies opting into --site-per-process (full Site Isolation).
 const char kSitePerProcess[] = "site_isolation.site_per_process";
 
+#if defined(OS_WIN)
+// A boolean value, controlling whether third party software is allowed to
+// inject into Chrome's processes.
+const char kThirdPartyBlockingEnabled[] = "third_party_blocking_enabled";
+#endif
+
 }  // namespace prefs
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h
index 7a9c1891..19ff2e4 100644
--- a/chrome/common/pref_names.h
+++ b/chrome/common/pref_names.h
@@ -908,6 +908,12 @@
 extern const char kIsolateOrigins[];
 extern const char kSitePerProcess[];
 
+#if defined(OS_WIN)
+// Preference for controlling whether or not third party blocking is enabled on
+// Windows.
+extern const char kThirdPartyBlockingEnabled[];
+#endif
+
 }  // namespace prefs
 
 #endif  // CHROME_COMMON_PREF_NAMES_H_
diff --git a/chrome/test/chromedriver/logging.cc b/chrome/test/chromedriver/logging.cc
index 19036de0..86f52469 100644
--- a/chrome/test/chromedriver/logging.cc
+++ b/chrome/test/chromedriver/logging.cc
@@ -112,7 +112,7 @@
     std::string entry = base::StringPrintf(
         "[%.3lf][%s]: %s",
         base::TimeDelta(base::TimeTicks::Now() -
-                        base::TimeTicks::FromInternalValue(g_start_time))
+                        base::TimeTicks::UnixEpoch())
             .InSecondsF(),
         level_name,
         message.c_str());
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index e5bb58b..8ed3f0ce 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -900,6 +900,16 @@
     ]
   },
 
+  "ThirdPartyBlockingEnabled": {
+    "os": ["win"],
+    "test_policy": { "ThirdPartyBlockingEnabled": false },
+    "pref_mappings": [
+      { "pref": "third_party_blocking_enabled",
+        "local_state": true
+      }
+    ]
+  },
+
   "ExtensionInstallBlacklist": {
     "os": ["win", "linux", "mac", "chromeos"],
     "test_policy": { "ExtensionInstallBlacklist": ["*"] },
diff --git a/components/autofill/core/browser/phone_number_i18n.cc b/components/autofill/core/browser/phone_number_i18n.cc
index be4825f..06e7e5b 100644
--- a/components/autofill/core/browser/phone_number_i18n.cc
+++ b/components/autofill/core/browser/phone_number_i18n.cc
@@ -13,7 +13,6 @@
 #include "components/autofill/core/browser/autofill_country.h"
 #include "components/autofill/core/browser/autofill_data_util.h"
 #include "components/autofill/core/browser/autofill_profile.h"
-#include "components/autofill/core/browser/validation.h"
 #include "third_party/libphonenumber/phonenumber_api.h"
 
 namespace autofill {
@@ -47,20 +46,22 @@
   return AutofillCountry::CountryCodeForLocale(app_locale);
 }
 
-// Returns true if |phone_number| is valid.
-bool IsValidPhoneNumber(const ::i18n::phonenumbers::PhoneNumber& phone_number) {
+// Returns true if |phone_number| is a possible number.
+bool IsPossiblePhoneNumber(
+    const ::i18n::phonenumbers::PhoneNumber& phone_number) {
   PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance();
-  if (!phone_util->IsPossibleNumber(phone_number))
-    return false;
+  return phone_util->IsPossibleNumber(phone_number);
+}
 
-  // Verify that the number has a valid area code (that in some cases could be
-  // empty) for the parsed country code.  Also verify that this is a valid
-  // number (for example, in the US 1234567 is not valid, because numbers do not
-  // start with 1).
-  if (!phone_util->IsValidNumber(phone_number))
-    return false;
+bool IsPossiblePhoneNumber(const std::string& phone_number,
+                           const std::string& country_code) {
+  ::i18n::phonenumbers::PhoneNumber parsed_number;
+  PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance();
+  auto result = phone_util->ParseAndKeepRawInput(phone_number, country_code,
+                                                 &parsed_number);
 
-  return true;
+  return result == ::i18n::phonenumbers::PhoneNumberUtil::NO_PARSING_ERROR &&
+         phone_util->IsPossibleNumber(parsed_number);
 }
 
 // Formats the given |number| as a human-readable string, and writes the result
@@ -76,9 +77,8 @@
                            base::string16* formatted_number,
                            base::string16* normalized_number) {
   PhoneNumberUtil::PhoneNumberFormat format =
-      country_code.empty() ?
-      PhoneNumberUtil::NATIONAL :
-      PhoneNumberUtil::INTERNATIONAL;
+      country_code.empty() ? PhoneNumberUtil::NATIONAL
+                           : PhoneNumberUtil::INTERNATIONAL;
 
   PhoneNumberUtil* phone_util = PhoneNumberUtil::GetInstance();
   std::string processed_number;
@@ -133,13 +133,13 @@
 
   // The |default_region| should already be sanitized.
   DCHECK_EQ(2U, default_region.size());
-  if (phone_util->ParseAndKeepRawInput(
-          number_text, default_region, i18n_number) !=
+  if (phone_util->ParseAndKeepRawInput(number_text, default_region,
+                                       i18n_number) !=
       PhoneNumberUtil::NO_PARSING_ERROR) {
     return false;
   }
 
-  if (!IsValidPhoneNumber(*i18n_number))
+  if (!IsPossiblePhoneNumber(*i18n_number))
     return false;
 
   std::string national_significant_number;
@@ -171,8 +171,8 @@
   if (i18n_number->has_country_code() &&
       i18n_number->country_code_source() !=
           ::i18n::phonenumbers::PhoneNumber::FROM_DEFAULT_COUNTRY) {
-    *country_code = base::UTF8ToUTF16(
-        base::IntToString(i18n_number->country_code()));
+    *country_code =
+        base::UTF8ToUTF16(base::IntToString(i18n_number->country_code()));
   }
 
   // The region might be different from what we started with.
@@ -230,16 +230,14 @@
 
   // Parse phone numbers based on the region
   ::i18n::phonenumbers::PhoneNumber i18n_number1;
-  if (phone_util->Parse(
-          base::UTF16ToUTF8(number_a), region.c_str(), &i18n_number1) !=
-              PhoneNumberUtil::NO_PARSING_ERROR) {
+  if (phone_util->Parse(base::UTF16ToUTF8(number_a), region.c_str(),
+                        &i18n_number1) != PhoneNumberUtil::NO_PARSING_ERROR) {
     return false;
   }
 
   ::i18n::phonenumbers::PhoneNumber i18n_number2;
-  if (phone_util->Parse(
-          base::UTF16ToUTF8(number_b), region.c_str(), &i18n_number2) !=
-              PhoneNumberUtil::NO_PARSING_ERROR) {
+  if (phone_util->Parse(base::UTF16ToUTF8(number_b), region.c_str(),
+                        &i18n_number2) != PhoneNumberUtil::NO_PARSING_ERROR) {
     return false;
   }
 
@@ -274,8 +272,7 @@
   // being a valid number.
   const std::string country_code =
       autofill::data_util::GetCountryCodeWithFallback(profile, locale);
-  if (IsValidPhoneNumber(base::UTF8ToUTF16(tentative_intl_phone),
-                         country_code)) {
+  if (IsPossiblePhoneNumber(tentative_intl_phone, country_code)) {
     return base::UTF8ToUTF16(
         FormatPhoneForDisplay(tentative_intl_phone, country_code));
   }
@@ -318,7 +315,9 @@
   }
 }
 
-PhoneObject::PhoneObject(const PhoneObject& other) { *this = other; }
+PhoneObject::PhoneObject(const PhoneObject& other) {
+  *this = other;
+}
 
 PhoneObject::PhoneObject() {}
 
diff --git a/components/autofill/core/browser/phone_number_i18n_unittest.cc b/components/autofill/core/browser/phone_number_i18n_unittest.cc
index ac791074..7bdba17 100644
--- a/components/autofill/core/browser/phone_number_i18n_unittest.cc
+++ b/components/autofill/core/browser/phone_number_i18n_unittest.cc
@@ -26,16 +26,16 @@
 
 TEST(PhoneNumberI18NTest, NormalizePhoneNumber) {
   // "Large" digits.
-  base::string16 phone1(UTF8ToUTF16(
-      "\xEF\xBC\x91\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90"
-      "\xEF\xBC\x97\xEF\xBC\x94\xEF\xBC\x99\xEF\xBC\x98"
-      "\xEF\xBC\x93\xEF\xBC\x92\xEF\xBC\x93"));
+  base::string16 phone1(
+      UTF8ToUTF16("\xEF\xBC\x91\xEF\xBC\x96\xEF\xBC\x95\xEF\xBC\x90"
+                  "\xEF\xBC\x97\xEF\xBC\x94\xEF\xBC\x99\xEF\xBC\x98"
+                  "\xEF\xBC\x93\xEF\xBC\x92\xEF\xBC\x93"));
   EXPECT_EQ(NormalizePhoneNumber(phone1, "US"), ASCIIToUTF16("16507498323"));
 
   // Devanagari script digits.
-  base::string16 phone2(UTF8ToUTF16(
-      "\xD9\xA1\xD9\xA6\xD9\xA5\xD9\xA0\xD9\xA8\xD9\xA3"
-      "\xD9\xA2\xD9\xA3\xD9\xA7\xD9\xA4\xD9\xA9"));
+  base::string16 phone2(
+      UTF8ToUTF16("\xD9\xA1\xD9\xA6\xD9\xA5\xD9\xA0\xD9\xA8\xD9\xA3"
+                  "\xD9\xA2\xD9\xA3\xD9\xA7\xD9\xA4\xD9\xA9"));
   EXPECT_EQ(NormalizePhoneNumber(phone2, "US"), ASCIIToUTF16("16508323749"));
 
   base::string16 phone3(UTF8ToUTF16("16503334\xef\xbc\x92\x35\xd9\xa5"));
@@ -50,7 +50,7 @@
 
 struct ParseNumberTestCase {
   // Expected parsing result.
-  bool valid;
+  bool isPossibleNumber;
   // Inputs.
   std::string input;
   std::string assumed_region;
@@ -71,7 +71,7 @@
   std::string deduced_region;
   ::i18n::phonenumbers::PhoneNumber unused_i18n_number;
   EXPECT_EQ(
-      test_case.valid,
+      test_case.isPossibleNumber,
       ParsePhoneNumber(ASCIIToUTF16(test_case.input), test_case.assumed_region,
                        &country_code, &city_code, &number, &deduced_region,
                        &unused_i18n_number));
@@ -91,10 +91,11 @@
         // strings.
         ParseNumberTestCase{false, "1234", "US"},
         // Test for string with exactly 7 digits.
-        // Not a valid number - starts with 1
-        ParseNumberTestCase{false, "17134567", "US"},
-        // Not a valid number - does not have area code.
-        ParseNumberTestCase{false, "7134567", "US"},
+        // Still a possible number with unknown("ZZ") deduced region.
+        ParseNumberTestCase{true, "17134567", "US", "7134567", "", "1", "ZZ"},
+        // Does not have area code, but still a possible number with
+        // unknown("ZZ") deduced region.
+        ParseNumberTestCase{true, "7134567", "US", "7134567", "", "", "ZZ"},
         // Valid Canadian toll-free number.
         ParseNumberTestCase{true, "3101234", "US", "3101234", "", "", "CA"},
         // Test for string with greater than 7 digits but less than 10 digits.
@@ -109,9 +110,11 @@
         // Should give back phone number and city code.
         // This one going to fail because of the incorrect area code.
         ParseNumberTestCase{false, "1234567890", "US"},
-        // This one going to fail because of the incorrect number (starts with
-        // 1).
-        ParseNumberTestCase{false, "6501567890", "US"},
+        // This is actually not a valid number because the first number after
+        // area code is 1. But it's still a possible number, just with deduced
+        // country set to unknown("ZZ").
+        ParseNumberTestCase{true, "6501567890", "US", "1567890", "650", "",
+                            "ZZ"},
         ParseNumberTestCase{true, "6504567890", "US", "4567890", "650", "",
                             "US"},
         // Test for string with exactly 10 digits and separators.
@@ -119,10 +122,10 @@
         ParseNumberTestCase{true, "(650) 456-7890", "US", "4567890", "650", "",
                             "US"},
         // Tests for string with over 10 digits.
-        // 01 is incorrect prefix in the USA, and if we interpret 011 as prefix,
-        // the
-        // rest is too short for international number - the parsing should fail.
-        ParseNumberTestCase{false, "0116504567890", "US"},
+        // 01 is incorrect prefix in the USA, we interpret 011 as prefix, and
+        // rest is parsed as a Singapore number(country code "SG").
+        ParseNumberTestCase{true, "0116504567890", "US", "04567890", "", "65",
+                            "SG"},
         // 011 is a correct "dial out" prefix in the USA - the parsing should
         // succeed.
         ParseNumberTestCase{true, "01116504567890", "US", "4567890", "650", "1",
@@ -162,116 +165,70 @@
 
 TEST(PhoneNumberI18NTest, ConstructPhoneNumber) {
   base::string16 number;
-  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("1"),
-                                   ASCIIToUTF16("650"),
-                                   ASCIIToUTF16("2345678"),
-                                   "US",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("1"), ASCIIToUTF16("650"),
+                                   ASCIIToUTF16("2345678"), "US", &number));
   EXPECT_EQ(ASCIIToUTF16("1 650-234-5678"), number);
-  EXPECT_TRUE(ConstructPhoneNumber(base::string16(),
-                                   ASCIIToUTF16("650"),
-                                   ASCIIToUTF16("2345678"),
-                                   "US",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(base::string16(), ASCIIToUTF16("650"),
+                                   ASCIIToUTF16("2345678"), "US", &number));
   EXPECT_EQ(ASCIIToUTF16("(650) 234-5678"), number);
-  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("1"),
-                                   base::string16(),
-                                   ASCIIToUTF16("6502345678"),
-                                   "US",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("1"), base::string16(),
+                                   ASCIIToUTF16("6502345678"), "US", &number));
   EXPECT_EQ(ASCIIToUTF16("1 650-234-5678"), number);
-  EXPECT_TRUE(ConstructPhoneNumber(base::string16(),
-                                   base::string16(),
-                                   ASCIIToUTF16("6502345678"),
-                                   "US",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(base::string16(), base::string16(),
+                                   ASCIIToUTF16("6502345678"), "US", &number));
   EXPECT_EQ(ASCIIToUTF16("(650) 234-5678"), number);
 
-  EXPECT_FALSE(ConstructPhoneNumber(base::string16(),
-                                    ASCIIToUTF16("650"),
-                                    ASCIIToUTF16("234567890"),
-                                    "US",
-                                    &number));
+  EXPECT_FALSE(ConstructPhoneNumber(base::string16(), ASCIIToUTF16("650"),
+                                    ASCIIToUTF16("234567890"), "US", &number));
   EXPECT_EQ(base::string16(), number);
   // Italian number
-  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("39"),
-                                   ASCIIToUTF16("347"),
-                                   ASCIIToUTF16("2345678"),
-                                   "IT",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("39"), ASCIIToUTF16("347"),
+                                   ASCIIToUTF16("2345678"), "IT", &number));
   EXPECT_EQ(ASCIIToUTF16("+39 347 234 5678"), number);
-  EXPECT_TRUE(ConstructPhoneNumber(base::string16(),
-                                   ASCIIToUTF16("347"),
-                                   ASCIIToUTF16("2345678"),
-                                   "IT",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(base::string16(), ASCIIToUTF16("347"),
+                                   ASCIIToUTF16("2345678"), "IT", &number));
   EXPECT_EQ(ASCIIToUTF16("347 234 5678"), number);
   // German number.
-  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("49"),
-                                   ASCIIToUTF16("024"),
-                                   ASCIIToUTF16("2345678901"),
-                                   "DE",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(ASCIIToUTF16("49"), ASCIIToUTF16("024"),
+                                   ASCIIToUTF16("2345678901"), "DE", &number));
   EXPECT_EQ(ASCIIToUTF16("+49 2423 45678901"), number);
-  EXPECT_TRUE(ConstructPhoneNumber(base::string16(),
-                                   ASCIIToUTF16("024"),
-                                   ASCIIToUTF16("2345678901"),
-                                   "DE",
-                                   &number));
+  EXPECT_TRUE(ConstructPhoneNumber(base::string16(), ASCIIToUTF16("024"),
+                                   ASCIIToUTF16("2345678901"), "DE", &number));
   EXPECT_EQ(ASCIIToUTF16("02423 45678901"), number);
 }
 
 TEST(PhoneNumberI18NTest, PhoneNumbersMatch) {
   // Same numbers, defined country code.
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("4158889999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("4158889999"), "US", "en-US"));
   // Same numbers, undefined country code.
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("4158889999"),
-                                std::string(),
+                                ASCIIToUTF16("4158889999"), std::string(),
                                 "en-US"));
 
   // Numbers differ by country code only.
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
-                                ASCIIToUTF16("4158889999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("4158889999"), "US", "en-US"));
 
   // Same numbers, different formats.
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("415-888-9999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("415-888-9999"), "US", "en-US"));
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("(415)888-9999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("(415)888-9999"), "US", "en-US"));
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("415 888 9999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("415 888 9999"), "US", "en-US"));
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("4158889999"),
-                                ASCIIToUTF16("415 TUV WXYZ"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("415 TUV WXYZ"), "US", "en-US"));
   EXPECT_TRUE(PhoneNumbersMatch(ASCIIToUTF16("1(415)888-99-99"),
-                                ASCIIToUTF16("+14158889999"),
-                                "US",
-                                "en-US"));
+                                ASCIIToUTF16("+14158889999"), "US", "en-US"));
 
   // Partial matches don't count.
   EXPECT_FALSE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
-                                 ASCIIToUTF16("8889999"),
-                                 "US",
-                                 "en-US"));
+                                 ASCIIToUTF16("8889999"), "US", "en-US"));
 
   // Different numbers don't match.
   EXPECT_FALSE(PhoneNumbersMatch(ASCIIToUTF16("14158889999"),
-                                 ASCIIToUTF16("1415888"),
-                                 "US",
-                                 "en-US"));
+                                 ASCIIToUTF16("1415888"), "US", "en-US"));
 }
 
 // Tests that the phone numbers are correctly formatted for the Payment
@@ -424,9 +381,8 @@
         // number.
         PhoneNumberFormatCase("+52 55 5342 8400", "US", "+52 55 5342 8400"),
         PhoneNumberFormatCase("52 55 5342 8400", "US", "+52 55 5342 8400"),
-        // This local MX number fits the length of a US number, so it's
-        // formatted for US.
-        PhoneNumberFormatCase("55 5342 8400", "US", "+1 555-342-8400")));
+        // This number will be recognized as a BR(55) number.
+        PhoneNumberFormatCase("55 5342 8400", "US", "+55 53428400")));
 
 INSTANTIATE_TEST_CASE_P(
     GetFormattedPhoneNumberForDisplay_EdgeCases,
@@ -441,7 +397,7 @@
                               "+52 55 5342 8400",
                               "es_MX"),
         PhoneNumberFormatCase("55 5342 8400", "", "+52 55 5342 8400", "es_MX"),
-        PhoneNumberFormatCase("55 5342 8400", "", "+1 555-342-8400", "en_US"),
+        PhoneNumberFormatCase("55 5342 8400", "", "+55 53428400", "en_US"),
         PhoneNumberFormatCase("61 2 9374 4000", "", "+61 2 9374 4000", "en_AU"),
         PhoneNumberFormatCase("02 9374 4000", "", "+61 2 9374 4000", "en_AU"),
 
@@ -452,11 +408,10 @@
         PhoneNumberFormatCase("61 2 9374 4000", "", "+61 2 9374 4000"),
         PhoneNumberFormatCase("52 55 5342 8400", "", "+52 55 5342 8400"),
         PhoneNumberFormatCase("1 415 555 5555", "", "+1 415-555-5555"),
+        PhoneNumberFormatCase("55 5342 8400", "", "+55 53428400"),
         // If no country code is found, formats for US.
         PhoneNumberFormatCase("02 9374 4000", "", "+1 029-374-4000"),
         PhoneNumberFormatCase("2 9374 4000", "", "+1 293744000"),
-        PhoneNumberFormatCase("55 5342 8400", "", "+1 555-342-8400"),
-        PhoneNumberFormatCase("52 55 5342 8400", "", "+52 55 5342 8400"),
         PhoneNumberFormatCase("415-555-5555", "", "+1 415-555-5555")));
 
 }  // namespace autofill
diff --git a/components/autofill/core/browser/phone_number_unittest.cc b/components/autofill/core/browser/phone_number_unittest.cc
index 6a5d246..806f5e5c 100644
--- a/components/autofill/core/browser/phone_number_unittest.cc
+++ b/components/autofill/core/browser/phone_number_unittest.cc
@@ -127,15 +127,17 @@
                              ASCIIToUTF16("650111111"), "US"));
   EXPECT_EQ(base::string16(), phone.GetRawInfo(PHONE_HOME_WHOLE_NUMBER));
 
-  // If the stored number is invalid, we still try to respond to queries
-  // for a complete number with what user has entered.
-  EXPECT_FALSE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
-                             ASCIIToUTF16("5141231234"), "US"));
+  // If the stored number is invalid due to metadata mismatch(non-existing
+  // carrier code for example), but otherwise is a possible number and can be
+  // parsed into different components, we should respond to queries with best
+  // effort as if it is a valid number.
+  EXPECT_TRUE(phone.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
+                            ASCIIToUTF16("5141231234"), "US"));
   EXPECT_EQ(ASCIIToUTF16("5141231234"),
             phone.GetInfo(PHONE_HOME_CITY_AND_NUMBER, "CA"));
   EXPECT_EQ(ASCIIToUTF16("5141231234"),
             phone.GetInfo(PHONE_HOME_WHOLE_NUMBER, "CA"));
-  EXPECT_EQ(base::string16(), phone.GetInfo(PHONE_HOME_CITY_CODE, "CA"));
+  EXPECT_EQ(ASCIIToUTF16("514"), phone.GetInfo(PHONE_HOME_CITY_CODE, "CA"));
 }
 
 // Test that cached phone numbers are correctly invalidated and updated.
diff --git a/components/autofill/ios/browser/autofill_agent.mm b/components/autofill/ios/browser/autofill_agent.mm
index 28960d45..53759b2 100644
--- a/components/autofill/ios/browser/autofill_agent.mm
+++ b/components/autofill/ios/browser/autofill_agent.mm
@@ -197,7 +197,8 @@
   // AutofillManagerDelegate.
   base::WeakPtr<autofill::AutofillPopupDelegate> popupDelegate_;
   // The autofill data that needs to be send when the |webState_| is shown.
-  NSString* pendingFormData_;
+  // The string is in JSON format.
+  NSString* pendingFormJSON_;
 }
 
 - (instancetype)initWithPrefService:(PrefService*)prefService
@@ -654,10 +655,10 @@
 
 - (void)webStateWasShown:(web::WebState*)webState {
   DCHECK_EQ(webState_, webState);
-  if (pendingFormData_) {
-    [self sendDataToWebState:pendingFormData_];
+  if (pendingFormJSON_) {
+    [self sendDataToWebState:pendingFormJSON_];
   }
-  pendingFormData_ = nil;
+  pendingFormJSON_ = nil;
 }
 
 - (void)webState:(web::WebState*)webState
@@ -870,32 +871,35 @@
 }
 
 - (void)onFormDataFilled:(const autofill::FormData&)form {
-  std::unique_ptr<base::DictionaryValue> formData(new base::DictionaryValue);
-  formData->SetString("formName", base::UTF16ToUTF8(form.name));
+  std::unique_ptr<base::DictionaryValue> JSONForm(new base::DictionaryValue);
+  JSONForm->SetString("formName", base::UTF16ToUTF8(form.name));
   // Note: Destruction of all child base::Value types is handled by the root
   // formData object on its own destruction.
-  auto fieldsData = base::MakeUnique<base::DictionaryValue>();
+  auto JSONFields = base::MakeUnique<base::DictionaryValue>();
 
-  const std::vector<autofill::FormFieldData>& fields = form.fields;
-  for (const auto& fieldData : fields) {
-    fieldsData->SetKey(base::UTF16ToUTF8(fieldData.name),
-                       base::Value(fieldData.value));
+  const std::vector<autofill::FormFieldData>& autofillFields = form.fields;
+  for (const auto& autofillField : autofillFields) {
+    if (JSONFields->HasKey(base::UTF16ToUTF8(autofillField.name)) &&
+        autofillField.value.empty())
+      continue;
+    JSONFields->SetKey(base::UTF16ToUTF8(autofillField.name),
+                       base::Value(autofillField.value));
   }
-  formData->Set("fields", std::move(fieldsData));
+  JSONForm->Set("fields", std::move(JSONFields));
 
   // Stringify the JSON data and send it to the UIWebView-side fillForm method.
-  std::string dataString;
-  base::JSONWriter::Write(*formData.get(), &dataString);
-  NSString* nsDataString = base::SysUTF8ToNSString(dataString);
+  std::string JSONString;
+  base::JSONWriter::Write(*JSONForm.get(), &JSONString);
+  NSString* nsJSONString = base::SysUTF8ToNSString(JSONString);
 
   if (!webState_->IsVisible()) {
-    pendingFormData_ = nsDataString;
+    pendingFormJSON_ = nsJSONString;
     return;
   }
-  [self sendDataToWebState:nsDataString];
+  [self sendDataToWebState:nsJSONString];
 }
 
-- (void)sendDataToWebState:(NSString*)formData {
+- (void)sendDataToWebState:(NSString*)JSONData {
   DCHECK(webState_->IsVisible());
   // It is possible that the fill was not initiated by selecting a suggestion.
   // In this case we provide an empty callback.
@@ -903,7 +907,7 @@
     suggestionHandledCompletion_ = [^{
     } copy];
   [jsAutofillManager_
-                fillForm:formData
+                fillForm:JSONData
       forceFillFieldName:base::SysUTF16ToNSString(pendingAutocompleteField_)
        completionHandler:suggestionHandledCompletion_];
   suggestionHandledCompletion_ = nil;
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm
index d5594fa..5d8a1ef6 100644
--- a/components/autofill/ios/browser/autofill_agent_unittests.mm
+++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -137,7 +137,7 @@
   [[mock_js_autofill_manager_ expect] fillForm:
                                           @"{\"fields\":{"
                                            "\"field1\":\"value 2\","
-                                           "\"region\":\"\""
+                                           "\"region\":\"California\""
                                            "},\"formName\":\"\"}"
                             forceFillFieldName:@""
                              completionHandler:[OCMArg any]];
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 721d1bb..0ae7329 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -146,7 +146,7 @@
 #   persistent IDs for all fields (but not for groups!) are needed. These are
 #   specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
 #   because doing so would break the deployed wire format!
-#   For your editing convenience: highest ID currently used: 406
+#   For your editing convenience: highest ID currently used: 407
 #   And don't forget to also update the EnterprisePolicies enum of
 #   histograms.xml (run 'python tools/metrics/histograms/update_policies.py').
 #
@@ -10832,7 +10832,22 @@
       If you do not set this policy, or disable it, there will be no change to the user's spellcheck preferences.
 
       The currently supported languages are: af, bg, ca, cs, da, de, el, en-AU, en-CA, en-GB, en-US, es, es-419, es-AR, es-ES, es-MX, es-US, et, fa, fo, fr, he, hi, hr, hu, id, it, ko, lt, lv, nb, nl, pl, pt-BR, pt-PT, ro, ru, sh, sk, sl, sq, sr, sv, ta, tg, tr, uk, vi.'''
-    }
+    },
+    {
+      'name': 'ThirdPartyBlockingEnabled',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome.win:65-'],
+      'features': {
+        'dynamic_refresh': False,
+        'per_profile': False,
+      },
+      'example_value': False,
+      'id': 407,
+      'caption': '''Enables third party software injection blocking''',
+      'tags': [],
+      'desc': '''If the policy is set to false then third party software will be allowed to inject executable code into Chrome's processes. If the policy is unset or set to true then third party software will be prevented from injecting executable code into Chrome's processes.''',
+    },
   ],
 
   'messages': {
diff --git a/content/browser/media/audio_stream_monitor.cc b/content/browser/media/audio_stream_monitor.cc
index 01736cc..9d649f98 100644
--- a/content/browser/media/audio_stream_monitor.cc
+++ b/content/browser/media/audio_stream_monitor.cc
@@ -149,7 +149,9 @@
                                                             bool is_audible) {
   DCHECK(thread_checker_.CalledOnValidThread());
   auto it = streams_.find(sid);
-  DCHECK(it != streams_.end());
+  if (it == streams_.end())
+    return;
+
   it->second = is_audible;
   UpdateStreams();
 }
diff --git a/content/browser/notifications/notification_event_dispatcher_impl.cc b/content/browser/notifications/notification_event_dispatcher_impl.cc
index 4e31a92..f950759 100644
--- a/content/browser/notifications/notification_event_dispatcher_impl.cc
+++ b/content/browser/notifications/notification_event_dispatcher_impl.cc
@@ -405,40 +405,40 @@
 void NotificationEventDispatcherImpl::RegisterNonPersistentNotification(
     const std::string& notification_id,
     int renderer_id,
-    int non_persistent_id) {
-  if (non_persistent_ids_.count(notification_id) &&
-      non_persistent_ids_[notification_id] != non_persistent_id) {
-    // Notify close for a previously displayed notification with the same id,
-    // this can happen when replacing a non-persistent notification with the
-    // same tag since from the JS point of view there will be two notification
-    // objects and the old one needs to receive the close event.
+    int request_id) {
+  if (request_ids_.count(notification_id) &&
+      request_ids_[notification_id] != request_id) {
+    // Notify close for a previously displayed notification with the same
+    // request id, this can happen when replacing a non-persistent notification
+    // with the same tag since from the JS point of view there will be two
+    // notification objects and the old one needs to receive the close event.
     // TODO(miguelg) this is probably not the right layer to do this.
     DispatchNonPersistentCloseEvent(notification_id);
   }
   renderer_ids_[notification_id] = renderer_id;
-  non_persistent_ids_[notification_id] = non_persistent_id;
+  request_ids_[notification_id] = request_id;
 }
 
 void NotificationEventDispatcherImpl::DispatchNonPersistentShowEvent(
     const std::string& notification_id) {
   if (!renderer_ids_.count(notification_id))
     return;
-  DCHECK(non_persistent_ids_.count(notification_id));
+  DCHECK(request_ids_.count(notification_id));
 
   RenderProcessHost* sender =
       RenderProcessHost::FromID(renderer_ids_[notification_id]);
   if (!sender)
     return;
 
-  sender->Send(new PlatformNotificationMsg_DidShow(
-      non_persistent_ids_[notification_id]));
+  sender->Send(
+      new PlatformNotificationMsg_DidShow(request_ids_[notification_id]));
 }
 
 void NotificationEventDispatcherImpl::DispatchNonPersistentClickEvent(
     const std::string& notification_id) {
   if (!renderer_ids_.count(notification_id))
     return;
-  DCHECK(non_persistent_ids_.count(notification_id));
+  DCHECK(request_ids_.count(notification_id));
 
   RenderProcessHost* sender =
       RenderProcessHost::FromID(renderer_ids_[notification_id]);
@@ -448,15 +448,15 @@
   // closed.
   if (!sender)
     return;
-  sender->Send(new PlatformNotificationMsg_DidClick(
-      non_persistent_ids_[notification_id]));
+  sender->Send(
+      new PlatformNotificationMsg_DidClick(request_ids_[notification_id]));
 }
 
 void NotificationEventDispatcherImpl::DispatchNonPersistentCloseEvent(
     const std::string& notification_id) {
   if (!renderer_ids_.count(notification_id))
     return;
-  DCHECK(non_persistent_ids_.count(notification_id));
+  DCHECK(request_ids_.count(notification_id));
 
   RenderProcessHost* sender =
       RenderProcessHost::FromID(renderer_ids_[notification_id]);
@@ -467,18 +467,18 @@
   if (!sender)
     return;
 
-  sender->Send(new PlatformNotificationMsg_DidClose(
-      non_persistent_ids_[notification_id]));
+  sender->Send(
+      new PlatformNotificationMsg_DidClose(request_ids_[notification_id]));
 
   // No interaction will follow anymore once the notification has been closed.
-  non_persistent_ids_.erase(notification_id);
+  request_ids_.erase(notification_id);
   renderer_ids_.erase(notification_id);
 }
 
 void NotificationEventDispatcherImpl::RendererGone(int renderer_id) {
   for (auto iter = renderer_ids_.begin(); iter != renderer_ids_.end();) {
     if (iter->second == renderer_id) {
-      non_persistent_ids_.erase(iter->first);
+      request_ids_.erase(iter->first);
       iter = renderer_ids_.erase(iter);
     } else {
       iter++;
diff --git a/content/browser/notifications/notification_event_dispatcher_impl.h b/content/browser/notifications/notification_event_dispatcher_impl.h
index ac0076c..7812a50 100644
--- a/content/browser/notifications/notification_event_dispatcher_impl.h
+++ b/content/browser/notifications/notification_event_dispatcher_impl.h
@@ -45,11 +45,10 @@
   // dissappears.
   void RendererGone(int renderer_id);
 
-  // Regsiter the fact that a non persistent notification has been
-  // displayed.
+  // Register the fact that a non persistent notification has been displayed.
   void RegisterNonPersistentNotification(const std::string& notification_id,
                                          int renderer_id,
-                                         int non_persistent_id);
+                                         int request_id);
 
  private:
   NotificationEventDispatcherImpl();
@@ -58,8 +57,8 @@
   // Notification Id -> renderer Id.
   std::map<std::string, int> renderer_ids_;
 
-  // Notification Id -> non-persistent notification id.
-  std::map<std::string, int> non_persistent_ids_;
+  // Notification Id -> request Id.
+  std::map<std::string, int> request_ids_;
 
   friend struct base::DefaultSingletonTraits<NotificationEventDispatcherImpl>;
 
diff --git a/content/browser/notifications/notification_id_generator.cc b/content/browser/notifications/notification_id_generator.cc
index 5323a1c..e8c1b57 100644
--- a/content/browser/notifications/notification_id_generator.cc
+++ b/content/browser/notifications/notification_id_generator.cc
@@ -57,7 +57,7 @@
 std::string NotificationIdGenerator::GenerateForNonPersistentNotification(
     const GURL& origin,
     const std::string& tag,
-    int non_persistent_notification_id,
+    int request_id,
     int render_process_id) const {
   DCHECK(origin.is_valid());
   DCHECK_EQ(origin, origin.GetOrigin());
@@ -72,7 +72,7 @@
     stream << base::IntToString(render_process_id);
     stream << kSeparator;
 
-    stream << base::IntToString(non_persistent_notification_id);
+    stream << base::IntToString(request_id);
   } else {
     stream << tag;
   }
diff --git a/content/browser/notifications/notification_id_generator.h b/content/browser/notifications/notification_id_generator.h
index 52cff09..f34784a 100644
--- a/content/browser/notifications/notification_id_generator.h
+++ b/content/browser/notifications/notification_id_generator.h
@@ -58,13 +58,12 @@
       int64_t persistent_notification_id) const;
 
   // Generates an id for a non-persistent notification given the notification's
-  // origin, tag and non-persistent notification id. The non-persistent
-  // notification id must've been created by the |render_process_id|.
-  std::string GenerateForNonPersistentNotification(
-      const GURL& origin,
-      const std::string& tag,
-      int non_persistent_notification_id,
-      int render_process_id) const;
+  // origin, tag and request id. The request id must've been created by the
+  // |render_process_id|.
+  std::string GenerateForNonPersistentNotification(const GURL& origin,
+                                                   const std::string& tag,
+                                                   int request_id,
+                                                   int render_process_id) const;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(NotificationIdGenerator);
diff --git a/content/browser/notifications/notification_message_filter.cc b/content/browser/notifications/notification_message_filter.cc
index 2341053..6d6115c 100644
--- a/content/browser/notifications/notification_message_filter.cc
+++ b/content/browser/notifications/notification_message_filter.cc
@@ -136,7 +136,7 @@
 }
 
 void NotificationMessageFilter::OnShowPlatformNotification(
-    int non_persistent_notification_id,
+    int request_id,
     const GURL& origin,
     const PlatformNotificationData& notification_data,
     const NotificationResources& notification_resources) {
@@ -158,13 +158,12 @@
 
   std::string notification_id =
       GetNotificationIdGenerator()->GenerateForNonPersistentNotification(
-          origin, notification_data.tag, non_persistent_notification_id,
-          process_id_);
+          origin, notification_data.tag, request_id, process_id_);
   NotificationEventDispatcherImpl* event_dispatcher =
       NotificationEventDispatcherImpl::GetInstance();
   non_persistent__notification_shown_ = true;
-  event_dispatcher->RegisterNonPersistentNotification(
-      notification_id, process_id_, non_persistent_notification_id);
+  event_dispatcher->RegisterNonPersistentNotification(notification_id,
+                                                      process_id_, request_id);
 
   service->DisplayNotification(browser_context_, notification_id, origin,
                                SanitizeNotificationData(notification_data),
@@ -309,14 +308,14 @@
 void NotificationMessageFilter::OnClosePlatformNotification(
     const GURL& origin,
     const std::string& tag,
-    int non_persistent_notification_id) {
+    int request_id) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   if (!RenderProcessHost::FromID(process_id_))
     return;
 
   std::string notification_id =
       GetNotificationIdGenerator()->GenerateForNonPersistentNotification(
-          origin, tag, non_persistent_notification_id, process_id_);
+          origin, tag, request_id, process_id_);
 
   PlatformNotificationService* service =
       GetContentClient()->browser()->GetPlatformNotificationService();
diff --git a/content/browser/notifications/notification_message_filter.h b/content/browser/notifications/notification_message_filter.h
index c471053..7e704221 100644
--- a/content/browser/notifications/notification_message_filter.h
+++ b/content/browser/notifications/notification_message_filter.h
@@ -53,7 +53,7 @@
   friend class BrowserThread;
 
   void OnShowPlatformNotification(
-      int non_persistent_notification_id,
+      int request_id,
       const GURL& origin,
       const PlatformNotificationData& notification_data,
       const NotificationResources& notification_resources);
@@ -69,7 +69,7 @@
                           const std::string& filter_tag);
   void OnClosePlatformNotification(const GURL& origin,
                                    const std::string& tag,
-                                   int non_persistent_notification_id);
+                                   int request_id);
   void OnClosePersistentNotification(const GURL& origin,
                                      const std::string& tag,
                                      const std::string& notification_id);
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc
index a1e7683..588cdd4 100644
--- a/content/browser/renderer_host/delegated_frame_host.cc
+++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -525,7 +525,6 @@
         local_surface_id, std::move(frame), std::move(hit_test_region_list));
     DCHECK(result);
   }
-
 }
 
 void DelegatedFrameHost::ClearDelegatedFrame() {
@@ -617,27 +616,25 @@
 }
 
 void DelegatedFrameHost::EvictDelegatedFrame() {
-  if (enable_viz_) {
-    NOTIMPLEMENTED();
-    return;
-  }
-
   if (!HasFallbackSurface())
     return;
 
   if (enable_surface_synchronization_) {
     client_->DelegatedFrameHostGetLayer()->SetFallbackSurfaceId(
         viz::SurfaceId());
-    support_->EvictCurrentSurface();
-    frame_evictor_->DiscardedFrame();
-    return;
+  } else {
+    client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent();
+    resize_lock_.reset();
+    UpdateGutters();
   }
 
-  client_->DelegatedFrameHostGetLayer()->SetShowSolidColorContent();
-  support_->EvictCurrentSurface();
-  resize_lock_.reset();
+  // TODO(samans): Ensure that with --enable-viz the latest frame is evicted and
+  // that DelegatedFrameHost updates the SurfaceLayer when the frame becomes
+  // visible again.
+  if (!enable_viz_)
+    support_->EvictCurrentSurface();
+
   frame_evictor_->DiscardedFrame();
-  UpdateGutters();
 }
 
 // static
diff --git a/content/common/platform_notification_messages.h b/content/common/platform_notification_messages.h
index cb37f10f..eb43d4ec 100644
--- a/content/common/platform_notification_messages.h
+++ b/content/common/platform_notification_messages.h
@@ -73,16 +73,13 @@
 // Messages sent from the browser to the renderer.
 
 // Informs the renderer that the browser has displayed the notification.
-IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidShow,
-                     int /* notification_id */)
+IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidShow, int /* request_id */)
 
 // Informs the renderer that the notification has been closed.
-IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClose,
-                     int /* notification_id */)
+IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClose, int /* request_id */)
 
 // Informs the renderer that the notification has been clicked on.
-IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClick,
-                     int /* notification_id */)
+IPC_MESSAGE_CONTROL1(PlatformNotificationMsg_DidClick, int /* request_id */)
 
 // Reply to PlatformNotificationHostMsg_ShowPersistent indicating that a
 // persistent notification has been shown on the platform (if |success| is
@@ -102,7 +99,7 @@
 
 IPC_MESSAGE_CONTROL4(
     PlatformNotificationHostMsg_Show,
-    int /* non_persistent_notification_id */,
+    int /* request_id */,
     GURL /* origin */,
     content::PlatformNotificationData /* notification_data */,
     content::NotificationResources /* notification_resources */)
@@ -124,7 +121,7 @@
 IPC_MESSAGE_CONTROL3(PlatformNotificationHostMsg_Close,
                      GURL /* origin */,
                      std::string /* tag */,
-                     int /* non_persistent_notification_id */)
+                     int /* request_id */)
 
 IPC_MESSAGE_CONTROL3(PlatformNotificationHostMsg_ClosePersistent,
                      GURL /* origin */,
diff --git a/content/network/network_context.cc b/content/network/network_context.cc
index ada5b79..d6faf822 100644
--- a/content/network/network_context.cc
+++ b/content/network/network_context.cc
@@ -7,12 +7,9 @@
 #include <memory>
 
 #include "base/command_line.h"
-#include "base/files/file_util.h"
 #include "base/logging.h"
 #include "base/message_loop/message_loop.h"
-#include "base/metrics/histogram_macros.h"
 #include "base/optional.h"
-#include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/task_scheduler/post_task.h"
 #include "base/task_scheduler/task_traits.h"
@@ -82,11 +79,6 @@
     : network_service_(network_service),
       params_(std::move(params)),
       binding_(this, std::move(request)) {
-  if (params_ && params_->http_cache_path) {
-    // Only sample 0.1% of NetworkContexts that get created.
-    if (base::RandUint64() % 1000 == 0)
-      disk_checker_ = std::make_unique<DiskChecker>(*params_->http_cache_path);
-  }
   network_service_->RegisterNetworkContext(this);
   ApplyContextParamsToBuilder(builder.get(), params_.get());
   owned_url_request_context_ = builder->Build();
@@ -186,30 +178,6 @@
     delete this;
 }
 
-NetworkContext::DiskChecker::DiskChecker(const base::FilePath& cache_path)
-    : cache_path_(cache_path) {
-  timer_.Start(FROM_HERE, base::TimeDelta::FromHours(24),
-               base::Bind(&DiskChecker::CheckDiskSize, base::Unretained(this)));
-
-  // Check disk size at startup, hopefully before the HTTPCache has been cleared
-  // from the previous run.
-  CheckDiskSize();
-}
-
-void NetworkContext::DiskChecker::CheckDiskSize() {
-  base::PostTaskWithTraits(
-      FROM_HERE, {base::MayBlock(), base::TaskPriority::BACKGROUND},
-      base::Bind(&DiskChecker::CheckDiskSizeOnBackgroundThread, cache_path_));
-}
-
-void NetworkContext::DiskChecker::CheckDiskSizeOnBackgroundThread(
-    const base::FilePath& cache_path) {
-  int64_t size = base::ComputeDirectorySize(cache_path);
-  UMA_HISTOGRAM_MEMORY_LARGE_MB("Net.DiskCache.Size", size / 1024 / 1024);
-}
-
-NetworkContext::DiskChecker::~DiskChecker() = default;
-
 std::unique_ptr<net::URLRequestContext> NetworkContext::MakeURLRequestContext(
     mojom::NetworkContextParams* network_context_params) {
   URLRequestContextBuilderMojo builder;
diff --git a/content/network/network_context.h b/content/network/network_context.h
index cc66fc9..017df8b 100644
--- a/content/network/network_context.h
+++ b/content/network/network_context.h
@@ -13,7 +13,6 @@
 #include "base/callback.h"
 #include "base/macros.h"
 #include "base/time/time.h"
-#include "base/timer/timer.h"
 #include "content/common/content_export.h"
 #include "content/network/cookie_manager.h"
 #include "content/public/common/network_service.mojom.h"
@@ -145,24 +144,6 @@
 
   std::unique_ptr<CookieManager> cookie_manager_;
 
-  // Temporary class to help diagnose the impact of https://crbug.com/711579.
-  // Every 24-hours, measures the size of the network cache and emits an UMA
-  // metric.
-  class DiskChecker {
-   public:
-    explicit DiskChecker(const base::FilePath& cache_path);
-    ~DiskChecker();
-
-   private:
-    void CheckDiskSize();
-    static void CheckDiskSizeOnBackgroundThread(
-        const base::FilePath& cache_path);
-    base::RepeatingTimer timer_;
-    base::FilePath cache_path_;
-    DISALLOW_COPY_AND_ASSIGN(DiskChecker);
-  };
-  std::unique_ptr<DiskChecker> disk_checker_;
-
   DISALLOW_COPY_AND_ASSIGN(NetworkContext);
 };
 
diff --git a/content/renderer/notifications/notification_manager.cc b/content/renderer/notifications/notification_manager.cc
index 8a551b25..074f0e3 100644
--- a/content/renderer/notifications/notification_manager.cc
+++ b/content/renderer/notifications/notification_manager.cc
@@ -93,10 +93,10 @@
 
   GURL origin_gurl = url::Origin(origin).GetURL();
 
-  int notification_id =
+  int request_id =
       notification_dispatcher_->GenerateNotificationId(NotificationWorkerId());
 
-  active_page_notifications_[notification_id] = ActiveNotificationData(
+  active_page_notifications_[request_id] = ActiveNotificationData(
       delegate, origin_gurl,
       notification_data.tag.Utf8(
           WebString::UTF8ConversionMode::kStrictReplacingErrorsWithFFFD));
@@ -105,8 +105,7 @@
   // origins. Perhaps also 'file:', 'blob:' and 'filesystem:'. See
   // https://crbug.com/490074 for detail.
   thread_safe_sender_->Send(new PlatformNotificationHostMsg_Show(
-      notification_id, origin_gurl,
-      ToPlatformNotificationData(notification_data),
+      request_id, origin_gurl, ToPlatformNotificationData(notification_data),
       ToNotificationResources(std::move(notification_resources))));
 }
 
@@ -245,8 +244,8 @@
   return handled;
 }
 
-void NotificationManager::OnDidShow(int notification_id) {
-  const auto& iter = active_page_notifications_.find(notification_id);
+void NotificationManager::OnDidShow(int request_id) {
+  const auto& iter = active_page_notifications_.find(request_id);
   if (iter == active_page_notifications_.end())
     return;
 
@@ -269,8 +268,8 @@
   pending_show_notification_requests_.Remove(request_id);
 }
 
-void NotificationManager::OnDidClose(int notification_id) {
-  const auto& iter = active_page_notifications_.find(notification_id);
+void NotificationManager::OnDidClose(int request_id) {
+  const auto& iter = active_page_notifications_.find(request_id);
   if (iter == active_page_notifications_.end())
     return;
 
@@ -279,8 +278,8 @@
   active_page_notifications_.erase(iter);
 }
 
-void NotificationManager::OnDidClick(int notification_id) {
-  const auto& iter = active_page_notifications_.find(notification_id);
+void NotificationManager::OnDidClick(int request_id) {
+  const auto& iter = active_page_notifications_.find(request_id);
   if (iter == active_page_notifications_.end())
     return;
 
diff --git a/content/renderer/notifications/notification_manager.h b/content/renderer/notifications/notification_manager.h
index 12af7d90..1c97fb6 100644
--- a/content/renderer/notifications/notification_manager.h
+++ b/content/renderer/notifications/notification_manager.h
@@ -70,10 +70,10 @@
                       NotificationDispatcher* notification_dispatcher);
 
   // IPC message handlers.
-  void OnDidShow(int notification_id);
+  void OnDidShow(int request_id);
   void OnDidShowPersistent(int request_id, bool success);
-  void OnDidClose(int notification_id);
-  void OnDidClick(int notification_id);
+  void OnDidClose(int request_id);
+  void OnDidClick(int request_id);
   void OnDidGetNotifications(
       int request_id,
       const std::vector<PersistentNotificationInfo>& notification_infos);
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 64d195b..05e9b46 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -119,6 +119,8 @@
     "program_manager.h",
     "query_manager.cc",
     "query_manager.h",
+    "raster_decoder.cc",
+    "raster_decoder.h",
     "renderbuffer_manager.cc",
     "renderbuffer_manager.h",
     "sampler_manager.cc",
diff --git a/gpu/command_buffer/service/gl_utils.h b/gpu/command_buffer/service/gl_utils.h
index f80a619b..9e30fe9c 100644
--- a/gpu/command_buffer/service/gl_utils.h
+++ b/gpu/command_buffer/service/gl_utils.h
@@ -34,10 +34,11 @@
 namespace gpu {
 
 struct Capabilities;
-class FeatureInfo;
 
 namespace gles2 {
 
+class FeatureInfo;
+
 struct CALayerSharedState {
   float opacity;
   bool is_clipped;
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc
new file mode 100644
index 0000000..9c3d2287
--- /dev/null
+++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -0,0 +1,650 @@
+// Copyright (c) 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "gpu/command_buffer/service/raster_decoder.h"
+
+#include "base/logging.h"
+#include "base/trace_event/trace_event.h"
+#include "gpu/command_buffer/common/capabilities.h"
+#include "gpu/command_buffer/common/context_result.h"
+#include "gpu/command_buffer/common/gles2_cmd_ids.h"
+#include "gpu/command_buffer/common/sync_token.h"
+#include "gpu/command_buffer/service/context_group.h"
+#include "gpu/command_buffer/service/gl_utils.h"
+#include "gpu/command_buffer/service/shader_translator.h"
+#include "ui/gl/gl_context.h"
+#include "ui/gl/gl_surface.h"
+
+// Local versions of the SET_GL_ERROR macros
+#define LOCAL_SET_GL_ERROR(error, function_name, msg) \
+  ERRORSTATE_SET_GL_ERROR(state_.GetErrorState(), error, function_name, msg)
+#define LOCAL_SET_GL_ERROR_INVALID_ENUM(function_name, value, label)          \
+  ERRORSTATE_SET_GL_ERROR_INVALID_ENUM(state_.GetErrorState(), function_name, \
+                                       value, label)
+#define LOCAL_COPY_REAL_GL_ERRORS_TO_WRAPPER(function_name)         \
+  ERRORSTATE_COPY_REAL_GL_ERRORS_TO_WRAPPER(state_.GetErrorState(), \
+                                            function_name)
+#define LOCAL_PEEK_GL_ERROR(function_name) \
+  ERRORSTATE_PEEK_GL_ERROR(state_.GetErrorState(), function_name)
+#define LOCAL_CLEAR_REAL_GL_ERRORS(function_name) \
+  ERRORSTATE_CLEAR_REAL_GL_ERRORS(state_.GetErrorState(), function_name)
+#define LOCAL_PERFORMANCE_WARNING(msg) \
+  PerformanceWarning(__FILE__, __LINE__, msg)
+#define LOCAL_RENDER_WARNING(msg) RenderWarning(__FILE__, __LINE__, msg)
+
+using namespace gpu::gles2;
+
+namespace gpu {
+namespace raster {
+
+// TODO(backer): Use a different set of commands.
+RasterDecoder::CommandInfo RasterDecoder::command_info[] = {
+#define GLES2_CMD_OP(name)                                   \
+  {                                                          \
+      nullptr, cmds::name::kArgFlags, cmds::name::cmd_flags, \
+      sizeof(cmds::name) / sizeof(CommandBufferEntry) - 1,   \
+  }, /* NOLINT */
+    GLES2_COMMAND_LIST(GLES2_CMD_OP)
+#undef GLES2_CMD_OP
+};
+
+RasterDecoder::RasterDecoder(GLES2DecoderClient* client,
+                             CommandBufferServiceBase* command_buffer_service,
+                             Outputter* outputter,
+                             ContextGroup* group)
+    : GLES2Decoder(command_buffer_service, outputter),
+      commands_to_process_(0),
+      current_decoder_error_(error::kNoError),
+      client_(client),
+      logger_(&debug_marker_manager_, client),
+      group_(group),
+      validators_(group_->feature_info()->validators()),
+      feature_info_(group_->feature_info()),
+      state_(group_->feature_info(), this, &logger_),
+      weak_ptr_factory_(this) {}
+
+RasterDecoder::~RasterDecoder() {}
+
+base::WeakPtr<GLES2Decoder> RasterDecoder::AsWeakPtr() {
+  return weak_ptr_factory_.GetWeakPtr();
+}
+
+gpu::ContextResult RasterDecoder::Initialize(
+    const scoped_refptr<gl::GLSurface>& surface,
+    const scoped_refptr<gl::GLContext>& context,
+    bool offscreen,
+    const DisallowedFeatures& disallowed_features,
+    const ContextCreationAttribHelper& attrib_helper) {
+  TRACE_EVENT0("gpu", "RasterDecoder::Initialize");
+  DCHECK(context->IsCurrent(surface.get()));
+  DCHECK(!context_.get());
+
+  state_.set_api(gl::g_current_gl_context);
+
+  set_initialized();
+
+  // TODO(backer): Remove temporary hack once we use a separate set of
+  // commands. Thread safe because Initialize is always called from CrGpuMain
+  // thread.
+  static bool updated_command_info = false;
+  if (!updated_command_info) {
+    updated_command_info = true;
+    command_info[cmds::GetString::kCmdId - kFirstGLES2Command].cmd_handler =
+        &RasterDecoder::HandleGetString;
+    command_info[cmds::TraceBeginCHROMIUM::kCmdId - kFirstGLES2Command]
+        .cmd_handler = &RasterDecoder::HandleTraceBeginCHROMIUM;
+    command_info[cmds::TraceEndCHROMIUM::kCmdId - kFirstGLES2Command]
+        .cmd_handler = &RasterDecoder::HandleTraceEndCHROMIUM;
+    command_info[cmds::InsertFenceSyncCHROMIUM::kCmdId - kFirstGLES2Command]
+        .cmd_handler = &RasterDecoder::HandleInsertFenceSyncCHROMIUM;
+    command_info[cmds::WaitSyncTokenCHROMIUM::kCmdId - kFirstGLES2Command]
+        .cmd_handler = &RasterDecoder::HandleWaitSyncTokenCHROMIUM;
+  }
+
+  if (!offscreen) {
+    return gpu::ContextResult::kFatalFailure;
+  }
+
+  if (group_->gpu_preferences().enable_gpu_debugging)
+    set_debug(true);
+
+  if (group_->gpu_preferences().enable_gpu_command_logging)
+    set_log_commands(true);
+
+  surface_ = surface;
+  context_ = context;
+
+  auto result =
+      group_->Initialize(this, attrib_helper.context_type, disallowed_features);
+  if (result != gpu::ContextResult::kSuccess) {
+    group_ =
+        nullptr;  // Must not destroy ContextGroup if it is not initialized.
+    Destroy(true);
+    return result;
+  }
+  CHECK_GL_ERROR();
+
+  return gpu::ContextResult::kSuccess;
+}
+
+void RasterDecoder::Destroy(bool have_context) {}
+
+void RasterDecoder::SetSurface(const scoped_refptr<gl::GLSurface>& surface) {
+  NOTIMPLEMENTED();
+}
+void RasterDecoder::ReleaseSurface() {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::TakeFrontBuffer(const Mailbox& mailbox) {
+  NOTIMPLEMENTED();
+}
+void RasterDecoder::ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) {
+  NOTIMPLEMENTED();
+}
+bool RasterDecoder::ResizeOffscreenFramebuffer(const gfx::Size& size) {
+  NOTIMPLEMENTED();
+  return true;
+}
+
+// Make this decoder's GL context current.
+bool RasterDecoder::MakeCurrent() {
+  DCHECK(surface_);
+  if (!context_.get())
+    return false;
+
+  if (WasContextLost()) {
+    LOG(ERROR) << "  GLES2DecoderImpl: Trying to make lost context current.";
+    return false;
+  }
+
+  if (!context_->MakeCurrent(surface_.get())) {
+    LOG(ERROR) << "  GLES2DecoderImpl: Context lost during MakeCurrent.";
+    MarkContextLost(error::kMakeCurrentFailed);
+    group_->LoseContexts(error::kUnknown);
+    return false;
+  }
+  return true;
+}
+
+GLES2Util* RasterDecoder::GetGLES2Util() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+gl::GLContext* RasterDecoder::GetGLContext() {
+  return context_.get();
+}
+
+ContextGroup* RasterDecoder::GetContextGroup() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+const FeatureInfo* RasterDecoder::GetFeatureInfo() const {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+Capabilities RasterDecoder::GetCapabilities() {
+  gpu::Capabilities caps;
+  caps.gpu_rasterization = true;
+  caps.supports_oop_raster = true;
+  return caps;
+}
+
+void RasterDecoder::RestoreState(const ContextState* prev_state) {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreActiveTexture() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreAllTextureUnitAndSamplerBindings(
+    const ContextState* prev_state) const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreActiveTextureUnitBinding(unsigned int target) const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreBufferBinding(unsigned int target) {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreBufferBindings() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreFramebufferBindings() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreRenderbufferBindings() {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreGlobalState() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreProgramBindings() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreTextureState(unsigned service_id) const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreTextureUnitBindings(unsigned unit) const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreVertexAttribArray(unsigned index) {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreAllExternalTextureBindingsIfNeeded() {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreDeviceWindowRectangles() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::ClearAllAttributes() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::RestoreAllAttributes() const {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::SetIgnoreCachedStateForTest(bool ignore) {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::SetForceShaderNameHashingForTest(bool force) {
+  NOTIMPLEMENTED();
+}
+
+uint32_t RasterDecoder::GetAndClearBackbufferClearBitsForTest() {
+  NOTIMPLEMENTED();
+  return 0;
+}
+
+size_t RasterDecoder::GetSavedBackTextureCountForTest() {
+  NOTIMPLEMENTED();
+  return 0;
+}
+
+size_t RasterDecoder::GetCreatedBackTextureCountForTest() {
+  NOTIMPLEMENTED();
+  return 0;
+}
+
+QueryManager* RasterDecoder::GetQueryManager() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+GpuFenceManager* RasterDecoder::GetGpuFenceManager() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+FramebufferManager* RasterDecoder::GetFramebufferManager() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+TransformFeedbackManager* RasterDecoder::GetTransformFeedbackManager() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+VertexArrayManager* RasterDecoder::GetVertexArrayManager() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+ImageManager* RasterDecoder::GetImageManagerForTest() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+bool RasterDecoder::HasPendingQueries() const {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+void RasterDecoder::ProcessPendingQueries(bool did_finish) {
+  NOTIMPLEMENTED();
+}
+
+bool RasterDecoder::HasMoreIdleWork() const {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+void RasterDecoder::PerformIdleWork() {
+  NOTIMPLEMENTED();
+}
+
+bool RasterDecoder::HasPollingWork() const {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+void RasterDecoder::PerformPollingWork() {
+  NOTIMPLEMENTED();
+}
+
+bool RasterDecoder::GetServiceTextureId(uint32_t client_texture_id,
+                                        uint32_t* service_texture_id) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+TextureBase* RasterDecoder::GetTextureBase(uint32_t client_id) {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+bool RasterDecoder::ClearLevel(Texture* texture,
+                               unsigned target,
+                               int level,
+                               unsigned format,
+                               unsigned type,
+                               int xoffset,
+                               int yoffset,
+                               int width,
+                               int height) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+bool RasterDecoder::ClearCompressedTextureLevel(Texture* texture,
+                                                unsigned target,
+                                                int level,
+                                                unsigned format,
+                                                int width,
+                                                int height) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+bool RasterDecoder::IsCompressedTextureFormat(unsigned format) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+bool RasterDecoder::ClearLevel3D(Texture* texture,
+                                 unsigned target,
+                                 int level,
+                                 unsigned format,
+                                 unsigned type,
+                                 int width,
+                                 int height,
+                                 int depth) {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+ErrorState* RasterDecoder::GetErrorState() {
+  return state_.GetErrorState();
+}
+
+void RasterDecoder::WaitForReadPixels(base::Closure callback) {
+  NOTIMPLEMENTED();
+}
+
+bool RasterDecoder::WasContextLost() const {
+  return false;
+}
+
+bool RasterDecoder::WasContextLostByRobustnessExtension() const {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+void RasterDecoder::MarkContextLost(error::ContextLostReason reason) {
+  NOTIMPLEMENTED();
+}
+
+bool RasterDecoder::CheckResetStatus() {
+  NOTIMPLEMENTED();
+  return false;
+}
+
+Logger* RasterDecoder::GetLogger() {
+  return &logger_;
+}
+
+void RasterDecoder::BeginDecoding() {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::EndDecoding() {
+  NOTIMPLEMENTED();
+}
+
+const char* RasterDecoder::GetCommandName(unsigned int command_id) const {
+  if (command_id >= kFirstGLES2Command && command_id < kNumCommands) {
+    return gles2::GetCommandName(static_cast<CommandId>(command_id));
+  }
+  return GetCommonCommandName(static_cast<cmd::CommandId>(command_id));
+}
+
+error::Error RasterDecoder::DoCommands(unsigned int num_commands,
+                                       const volatile void* buffer,
+                                       int num_entries,
+                                       int* entries_processed) {
+  DCHECK(entries_processed);
+  commands_to_process_ = num_commands;
+  error::Error result = error::kNoError;
+  const volatile CommandBufferEntry* cmd_data =
+      static_cast<const volatile CommandBufferEntry*>(buffer);
+  int process_pos = 0;
+  unsigned int command = 0;
+
+  while (process_pos < num_entries && result == error::kNoError &&
+         commands_to_process_--) {
+    const unsigned int size = cmd_data->value_header.size;
+    command = cmd_data->value_header.command;
+
+    if (size == 0) {
+      result = error::kInvalidSize;
+      break;
+    }
+
+    if (static_cast<int>(size) + process_pos > num_entries) {
+      result = error::kOutOfBounds;
+      break;
+    }
+
+    const unsigned int arg_count = size - 1;
+    unsigned int command_index = command - kFirstGLES2Command;
+    if (command_index < arraysize(command_info)) {
+      const CommandInfo& info = command_info[command_index];
+      unsigned int info_arg_count = static_cast<unsigned int>(info.arg_count);
+      if ((info.arg_flags == cmd::kFixed && arg_count == info_arg_count) ||
+          (info.arg_flags == cmd::kAtLeastN && arg_count >= info_arg_count)) {
+        uint32_t immediate_data_size = (arg_count - info_arg_count) *
+                                       sizeof(CommandBufferEntry);  // NOLINT
+        if (info.cmd_handler == nullptr) {
+          LOG(ERROR) << "[" << logger_.GetLogPrefix() << "] "
+                     << GetCommandName(command) << "(" << command << ", "
+                     << command_index << ") is NOTIMPLEMENTED";
+        } else {
+          result = (this->*info.cmd_handler)(immediate_data_size, cmd_data);
+        }
+      } else {
+        result = error::kInvalidArguments;
+      }
+    } else {
+      result = DoCommonCommand(command, arg_count, cmd_data);
+    }
+
+    if (result == error::kNoError &&
+        current_decoder_error_ != error::kNoError) {
+      result = current_decoder_error_;
+      current_decoder_error_ = error::kNoError;
+    }
+
+    if (result != error::kDeferCommandUntilLater) {
+      process_pos += size;
+      cmd_data += size;
+    }
+  }
+
+  *entries_processed = process_pos;
+
+  if (error::IsError(result)) {
+    LOG(ERROR) << "Error: " << result << " for Command "
+               << GetCommandName(command);
+  }
+
+  return result;
+}
+
+const ContextState* RasterDecoder::GetContextState() {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+scoped_refptr<ShaderTranslatorInterface> RasterDecoder::GetTranslator(
+    unsigned int type) {
+  NOTIMPLEMENTED();
+  return nullptr;
+}
+
+void RasterDecoder::BindImage(uint32_t client_texture_id,
+                              uint32_t texture_target,
+                              gl::GLImage* image,
+                              bool can_bind_to_sampler) {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::OnContextLostError() {
+  NOTIMPLEMENTED();
+}
+
+void RasterDecoder::OnOutOfMemoryError() {
+  NOTIMPLEMENTED();
+}
+
+error::Error RasterDecoder::HandleTraceBeginCHROMIUM(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  const volatile gles2::cmds::TraceBeginCHROMIUM& c =
+      *static_cast<const volatile gles2::cmds::TraceBeginCHROMIUM*>(cmd_data);
+  Bucket* category_bucket = GetBucket(c.category_bucket_id);
+  Bucket* name_bucket = GetBucket(c.name_bucket_id);
+  if (!category_bucket || category_bucket->size() == 0 || !name_bucket ||
+      name_bucket->size() == 0) {
+    return error::kInvalidArguments;
+  }
+
+  std::string category_name;
+  std::string trace_name;
+  if (!category_bucket->GetAsString(&category_name) ||
+      !name_bucket->GetAsString(&trace_name)) {
+    return error::kInvalidArguments;
+  }
+
+  debug_marker_manager_.PushGroup(trace_name);
+  return error::kNoError;
+}
+
+error::Error RasterDecoder::HandleTraceEndCHROMIUM(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  debug_marker_manager_.PopGroup();
+  return error::kNoError;
+}
+
+error::Error RasterDecoder::HandleInsertFenceSyncCHROMIUM(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  const volatile gles2::cmds::InsertFenceSyncCHROMIUM& c =
+      *static_cast<const volatile gles2::cmds::InsertFenceSyncCHROMIUM*>(
+          cmd_data);
+
+  const uint64_t release_count = c.release_count();
+  client_->OnFenceSyncRelease(release_count);
+  // Exit inner command processing loop so that we check the scheduling state
+  // and yield if necessary as we may have unblocked a higher priority context.
+  ExitCommandProcessingEarly();
+  return error::kNoError;
+}
+
+error::Error RasterDecoder::HandleWaitSyncTokenCHROMIUM(
+    uint32_t immediate_data_size,
+    const volatile void* cmd_data) {
+  const volatile gles2::cmds::WaitSyncTokenCHROMIUM& c =
+      *static_cast<const volatile gles2::cmds::WaitSyncTokenCHROMIUM*>(
+          cmd_data);
+
+  const gpu::CommandBufferNamespace kMinNamespaceId =
+      gpu::CommandBufferNamespace::INVALID;
+  const gpu::CommandBufferNamespace kMaxNamespaceId =
+      gpu::CommandBufferNamespace::NUM_COMMAND_BUFFER_NAMESPACES;
+
+  gpu::CommandBufferNamespace namespace_id =
+      static_cast<gpu::CommandBufferNamespace>(c.namespace_id);
+  if ((namespace_id < static_cast<int32_t>(kMinNamespaceId)) ||
+      (namespace_id >= static_cast<int32_t>(kMaxNamespaceId))) {
+    namespace_id = gpu::CommandBufferNamespace::INVALID;
+  }
+  const CommandBufferId command_buffer_id =
+      CommandBufferId::FromUnsafeValue(c.command_buffer_id());
+  const uint64_t release = c.release_count();
+
+  gpu::SyncToken sync_token;
+  sync_token.Set(namespace_id, 0, command_buffer_id, release);
+  return client_->OnWaitSyncToken(sync_token) ? error::kDeferCommandUntilLater
+                                              : error::kNoError;
+}
+
+error::Error RasterDecoder::HandleGetString(uint32_t immediate_data_size,
+                                            const volatile void* cmd_data) {
+  const volatile gles2::cmds::GetString& c =
+      *static_cast<const volatile gles2::cmds::GetString*>(cmd_data);
+  GLenum name = static_cast<GLenum>(c.name);
+
+  // TODO(backer): Passthrough decoder does not validate. It's possible that
+  // we don't have a validator there.
+  if (!validators_->string_type.IsValid(name)) {
+    LOCAL_SET_GL_ERROR_INVALID_ENUM("glGetString", name, "name");
+    return error::kNoError;
+  }
+
+  const char* str = nullptr;
+  std::string extensions;
+  switch (name) {
+    case GL_VERSION:
+      str = GetServiceVersionString(feature_info_.get());
+      break;
+    case GL_SHADING_LANGUAGE_VERSION:
+      str = GetServiceShadingLanguageVersionString(feature_info_.get());
+      break;
+    case GL_EXTENSIONS: {
+      str = "";
+      NOTIMPLEMENTED();
+      break;
+    }
+    default:
+      str = reinterpret_cast<const char*>(api()->glGetStringFn(name));
+      break;
+  }
+  Bucket* bucket = CreateBucket(c.bucket_id);
+  bucket->SetFromString(str);
+  return error::kNoError;
+}
+
+}  // namespace raster
+}  // namespace gpu
diff --git a/gpu/command_buffer/service/raster_decoder.h b/gpu/command_buffer/service/raster_decoder.h
new file mode 100644
index 0000000..9b81cfd
--- /dev/null
+++ b/gpu/command_buffer/service/raster_decoder.h
@@ -0,0 +1,222 @@
+// Copyright (c) 2017 The Chromium 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 GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
+#define GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
+
+#include <stdint.h>
+
+#include <string>
+#include <vector>
+
+#include "base/callback_forward.h"
+#include "base/macros.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "build/build_config.h"
+#include "gpu/command_buffer/common/capabilities.h"
+#include "gpu/command_buffer/common/command_buffer_id.h"
+#include "gpu/command_buffer/common/constants.h"
+#include "gpu/command_buffer/common/context_result.h"
+#include "gpu/command_buffer/common/debug_marker_manager.h"
+#include "gpu/command_buffer/common/gles2_cmd_format.h"
+#include "gpu/command_buffer/service/context_state.h"
+#include "gpu/command_buffer/service/error_state.h"
+#include "gpu/command_buffer/service/feature_info.h"
+#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
+#include "gpu/command_buffer/service/gles2_cmd_validation.h"
+#include "gpu/command_buffer/service/logger.h"
+#include "gpu/gpu_export.h"
+
+namespace gpu {
+namespace raster {
+
+// This class implements the AsyncAPIInterface interface, decoding
+// RasterInterface commands and calling GL.
+class GPU_EXPORT RasterDecoder : public gles2::GLES2Decoder,
+                                 public gles2::ErrorStateClient {
+ public:
+  RasterDecoder(gles2::GLES2DecoderClient* client,
+                CommandBufferServiceBase* command_buffer_service,
+                gles2::Outputter* outputter,
+                gles2::ContextGroup* group);
+
+  ~RasterDecoder() override;
+
+  // GLES2Decoder implementation.
+  base::WeakPtr<GLES2Decoder> AsWeakPtr() override;
+  gpu::ContextResult Initialize(
+      const scoped_refptr<gl::GLSurface>& surface,
+      const scoped_refptr<gl::GLContext>& context,
+      bool offscreen,
+      const gles2::DisallowedFeatures& disallowed_features,
+      const gles2::ContextCreationAttribHelper& attrib_helper) override;
+  void Destroy(bool have_context) override;
+  void SetSurface(const scoped_refptr<gl::GLSurface>& surface) override;
+  void ReleaseSurface() override;
+  void TakeFrontBuffer(const Mailbox& mailbox) override;
+  void ReturnFrontBuffer(const Mailbox& mailbox, bool is_lost) override;
+  bool ResizeOffscreenFramebuffer(const gfx::Size& size) override;
+  bool MakeCurrent() override;
+  gles2::GLES2Util* GetGLES2Util() override;
+  gl::GLContext* GetGLContext() override;
+  gles2::ContextGroup* GetContextGroup() override;
+  const gles2::FeatureInfo* GetFeatureInfo() const override;
+  Capabilities GetCapabilities() override;
+  void RestoreState(const gles2::ContextState* prev_state) override;
+  void RestoreActiveTexture() const override;
+  void RestoreAllTextureUnitAndSamplerBindings(
+      const gles2::ContextState* prev_state) const override;
+  void RestoreActiveTextureUnitBinding(unsigned int target) const override;
+  void RestoreBufferBinding(unsigned int target) override;
+  void RestoreBufferBindings() const override;
+  void RestoreFramebufferBindings() const override;
+  void RestoreRenderbufferBindings() override;
+  void RestoreGlobalState() const override;
+  void RestoreProgramBindings() const override;
+  void RestoreTextureState(unsigned service_id) const override;
+  void RestoreTextureUnitBindings(unsigned unit) const override;
+  void RestoreVertexAttribArray(unsigned index) override;
+  void RestoreAllExternalTextureBindingsIfNeeded() override;
+  void RestoreDeviceWindowRectangles() const override;
+  void ClearAllAttributes() const override;
+  void RestoreAllAttributes() const override;
+  void SetIgnoreCachedStateForTest(bool ignore) override;
+  void SetForceShaderNameHashingForTest(bool force) override;
+  uint32_t GetAndClearBackbufferClearBitsForTest() override;
+  size_t GetSavedBackTextureCountForTest() override;
+  size_t GetCreatedBackTextureCountForTest() override;
+  gles2::QueryManager* GetQueryManager() override;
+  gles2::GpuFenceManager* GetGpuFenceManager() override;
+  gles2::FramebufferManager* GetFramebufferManager() override;
+  gles2::TransformFeedbackManager* GetTransformFeedbackManager() override;
+  gles2::VertexArrayManager* GetVertexArrayManager() override;
+  gles2::ImageManager* GetImageManagerForTest() override;
+  bool HasPendingQueries() const override;
+  void ProcessPendingQueries(bool did_finish) override;
+  bool HasMoreIdleWork() const override;
+  void PerformIdleWork() override;
+  bool HasPollingWork() const override;
+  void PerformPollingWork() override;
+  bool GetServiceTextureId(uint32_t client_texture_id,
+                           uint32_t* service_texture_id) override;
+  gles2::TextureBase* GetTextureBase(uint32_t client_id) override;
+  bool ClearLevel(gles2::Texture* texture,
+                  unsigned target,
+                  int level,
+                  unsigned format,
+                  unsigned type,
+                  int xoffset,
+                  int yoffset,
+                  int width,
+                  int height) override;
+  bool ClearCompressedTextureLevel(gles2::Texture* texture,
+                                   unsigned target,
+                                   int level,
+                                   unsigned format,
+                                   int width,
+                                   int height) override;
+  bool IsCompressedTextureFormat(unsigned format) override;
+  bool ClearLevel3D(gles2::Texture* texture,
+                    unsigned target,
+                    int level,
+                    unsigned format,
+                    unsigned type,
+                    int width,
+                    int height,
+                    int depth) override;
+  gles2::ErrorState* GetErrorState() override;
+  void WaitForReadPixels(base::Closure callback) override;
+  bool WasContextLost() const override;
+  bool WasContextLostByRobustnessExtension() const override;
+  void MarkContextLost(error::ContextLostReason reason) override;
+  bool CheckResetStatus() override;
+  gles2::Logger* GetLogger() override;
+  void BeginDecoding() override;
+  void EndDecoding() override;
+  const char* GetCommandName(unsigned int command_id) const;
+  error::Error DoCommands(unsigned int num_commands,
+                          const volatile void* buffer,
+                          int num_entries,
+                          int* entries_processed) override;
+  const gles2::ContextState* GetContextState() override;
+  scoped_refptr<gles2::ShaderTranslatorInterface> GetTranslator(
+      unsigned int type) override;
+  void BindImage(uint32_t client_texture_id,
+                 uint32_t texture_target,
+                 gl::GLImage* image,
+                 bool can_bind_to_sampler) override;
+
+  // ErrorClientState implementation.
+  void OnContextLostError() override;
+  void OnOutOfMemoryError() override;
+
+ private:
+  gl::GLApi* api() const { return state_.api(); }
+
+  // Set remaining commands to process to 0 to force DoCommands to return
+  // and allow context preemption and GPU watchdog checks in CommandExecutor().
+  void ExitCommandProcessingEarly() { commands_to_process_ = 0; }
+
+  error::Error HandleGetString(uint32_t immediate_data_size,
+                               const volatile void* cmd_data);
+  error::Error HandleTraceBeginCHROMIUM(uint32_t immediate_data_size,
+                                        const volatile void* cmd_data);
+  error::Error HandleTraceEndCHROMIUM(uint32_t immediate_data_size,
+                                      const volatile void* cmd_data);
+  error::Error HandleInsertFenceSyncCHROMIUM(uint32_t immediate_data_size,
+                                             const volatile void* cmd_data);
+  error::Error HandleWaitSyncTokenCHROMIUM(uint32_t immediate_data_size,
+                                           const volatile void* cmd_data);
+
+  typedef gpu::gles2::GLES2Decoder::Error (RasterDecoder::*CmdHandler)(
+      uint32_t immediate_data_size,
+      const volatile void* data);
+
+  // A struct to hold info about each command.
+  struct CommandInfo {
+    CmdHandler cmd_handler;
+    uint8_t arg_flags;   // How to handle the arguments for this command
+    uint8_t cmd_flags;   // How to handle this command
+    uint16_t arg_count;  // How many arguments are expected for this command.
+  };
+
+  // A table of CommandInfo for all the commands.
+  static CommandInfo
+      command_info[gles2::kNumCommands - gles2::kFirstGLES2Command];
+
+  // Number of commands remaining to be processed in DoCommands().
+  int commands_to_process_;
+
+  // The current decoder error communicates the decoder error through command
+  // processing functions that do not return the error value. Should be set
+  // only if not returning an error.
+  error::Error current_decoder_error_;
+
+  scoped_refptr<gl::GLSurface> surface_;
+  scoped_refptr<gl::GLContext> context_;
+
+  gles2::GLES2DecoderClient* client_;
+
+  gles2::DebugMarkerManager debug_marker_manager_;
+  gles2::Logger logger_;
+
+  // The ContextGroup for this decoder uses to track resources.
+  scoped_refptr<gles2::ContextGroup> group_;
+  const gles2::Validators* validators_;
+  scoped_refptr<gles2::FeatureInfo> feature_info_;
+
+  // All the state for this context.
+  gles2::ContextState state_;
+
+  base::WeakPtrFactory<gles2::GLES2Decoder> weak_ptr_factory_;
+
+  DISALLOW_COPY_AND_ASSIGN(RasterDecoder);
+};
+
+}  // namespace raster
+}  // namespace gpu
+
+#endif  // GPU_COMMAND_BUFFER_SERVICE_RASTER_DECODER_H_
diff --git a/gpu/ipc/service/raster_command_buffer_stub.cc b/gpu/ipc/service/raster_command_buffer_stub.cc
index 61950a8..7eb8506 100644
--- a/gpu/ipc/service/raster_command_buffer_stub.cc
+++ b/gpu/ipc/service/raster_command_buffer_stub.cc
@@ -20,6 +20,7 @@
 #include "gpu/command_buffer/service/logger.h"
 #include "gpu/command_buffer/service/mailbox_manager.h"
 #include "gpu/command_buffer/service/memory_tracking.h"
+#include "gpu/command_buffer/service/raster_decoder.h"
 #include "gpu/command_buffer/service/service_utils.h"
 #include "gpu/command_buffer/service/sync_point_manager.h"
 #include "gpu/command_buffer/service/transfer_buffer_manager.h"
@@ -130,7 +131,7 @@
 
   command_buffer_ = std::make_unique<CommandBufferService>(
       this, context_group_->transfer_buffer_manager());
-  decoder_.reset(gles2::GLES2Decoder::Create(
+  decoder_.reset(new raster::RasterDecoder(
       this, command_buffer_.get(), manager->outputter(), context_group_.get()));
 
   sync_point_client_state_ =
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 8a8de12..406e9795 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -4256,6 +4256,7 @@
     "isolated_scripts": [
       {
         "args": [
+          "--xvfb",
           "--extra-browser-args=--enable-viz"
         ],
         "isolate_name": "telemetry_perf_unittests",
@@ -4269,9 +4270,10 @@
       {
         "args": [
           "--extra-browser-args=--enable-viz",
-          "--skip=telemetry.internal.backends.chrome_inspector.inspector_page_unittest.InspectorPageTest.testCaptureScreenshot",
-          "--skip=telemetry.internal.browser.tab_unittest.GpuTabTest.testScreenshot",
           "--skip=telemetry.internal.actions.scroll_unittest.ScrollActionTest.testWheelScrollDistanceWhileZoomed",
+          "--skip=telemetry.internal.backends.chrome_inspector.inspector_page_unittest.InspectorPageTest.testCaptureScreenshot",
+          "--skip=telemetry.internal.backends.chrome.tab_list_backend_unittest.TabListBackendTest.testNewTab",
+          "--skip=telemetry.internal.browser.tab_unittest.GpuTabTest.testScreenshot",
           "--skip=telemetry.page.cache_temperature_unittest.CacheTemperatureTests.testEnsureHotAfterColdRun"
         ],
         "isolate_name": "telemetry_unittests",
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json
index ffc5509..0656533 100644
--- a/testing/buildbot/chromium.linux.json
+++ b/testing/buildbot/chromium.linux.json
@@ -1380,6 +1380,18 @@
         "test": "content_browsertests"
       },
       {
+        "args": [
+          "--enable-viz",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter"
+        ],
+        "name": "viz_content_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 2
+        },
+        "test": "content_browsertests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true
         },
@@ -1949,6 +1961,18 @@
         "test": "content_browsertests"
       },
       {
+        "args": [
+          "--enable-viz",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter"
+        ],
+        "name": "viz_content_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 2
+        },
+        "test": "content_browsertests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/chromium.sandbox.json b/testing/buildbot/chromium.sandbox.json
index 7f0c462..6714234 100644
--- a/testing/buildbot/chromium.sandbox.json
+++ b/testing/buildbot/chromium.sandbox.json
@@ -172,6 +172,18 @@
         "test": "content_browsertests"
       },
       {
+        "args": [
+          "--enable-viz",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/viz.content_browsertests.filter"
+        ],
+        "name": "viz_content_browsertests",
+        "swarming": {
+          "can_use_on_swarming_builders": true,
+          "shards": 2
+        },
+        "test": "content_browsertests"
+      },
+      {
         "swarming": {
           "can_use_on_swarming_builders": true
         },
diff --git a/testing/buildbot/filters/viz.browser_tests.filter b/testing/buildbot/filters/viz.browser_tests.filter
index 0fe9158..6e295bf 100644
--- a/testing/buildbot/filters/viz.browser_tests.filter
+++ b/testing/buildbot/filters/viz.browser_tests.filter
@@ -1,5 +1,7 @@
+-AllForms/FormStructureBrowserTest.DataDrivenHeuristics/118
 -AppApiTest.AppProcessBackgroundInstances
 -AppApiTest.ClientRedirectToAppFromExtension
+-AppApiTest.NavigateIntoAppProcess
 -AppApiTest.OpenWebPopupFromWebIframe
 -AppApiTest.ReloadIntoAppProcess
 -AppApiTest.ReloadIntoAppProcessWithJavaScript
@@ -26,22 +28,7 @@
 -CloudPrintPolicyTest.NormalPassedFlag
 -CommonNameMismatchBrowserTest.InterstitialNavigateAwayWhileLoading/0
 -CommonNameMismatchBrowserTest.InterstitialNavigateAwayWhileLoading/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAboutBlankAndSrcdoc/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAboutBlankAndSrcdoc/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAboutBlankIframes/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAboutBlankIframes/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAllFrames/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptAllFrames/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptBypassPageCSP/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptBypassPageCSP/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptCSSLocalization/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptCSSLocalization/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptExtensionProcess/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptExtensionProcess/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptFragmentNavigation/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptIsolatedWorlds/0
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptIsolatedWorlds/1
--ContentScriptApiTests/ContentScriptApiTest.ContentScriptViewSource/0
+-ContentScriptApiTests/ContentScriptApiTest.*
 -ContentSettingsMixedScriptIgnoreCertErrorsTest.MainFrameMetrics
 -ContentSettingsTest.RedirectCrossOrigin
 -ContextMenuBrowserTest.OpenLinkInProfile
@@ -49,6 +36,7 @@
 -DevToolsAutoOpenerTest.TestAutoOpenForTabs
 -DidChangeVisibleSecurityStateTest.DidChangeVisibleSecurityStateObserver
 -DomainReliabilityBrowserTest.UploadAtShutdown
+-ErrorPageTest.DNSError_GoBack2AndForward
 -ExecuteScriptApiTest.ExecuteScriptBadEncoding
 -ExecuteScriptApiTest.ExecuteScriptBasic
 -ExecuteScriptApiTest.ExecuteScriptByFrameId
@@ -70,18 +58,7 @@
 -GeolocationBrowserTest.IFramesWithFreshPosition
 -GeolocationBrowserTest.NoPromptBeforeStart
 -HostedAppProcessModelTest.IframeNavigationsInsideHostedApp/0
--HostedAppTest.LocationBarForHostedAppWithoutWWW/0
--HostedAppTest.LocationBarForHostedAppWithoutWWW/1
--HostedAppTest.OpenLinkInNewTab/0
--HostedAppTest.OpenLinkInNewTab/1
--HostedAppTest.ShouldShowLocationBarForBookmarkApp/0
--HostedAppTest.ShouldShowLocationBarForBookmarkApp/1
--HostedAppTest.ShouldShowLocationBarForHTTPBookmarkApp/0
--HostedAppTest.ShouldShowLocationBarForHTTPBookmarkApp/1
--HostedAppTest.ShouldShowLocationBarForHTTPSBookmarkApp/0
--HostedAppTest.ShouldShowLocationBarForHTTPSBookmarkApp/1
--HostedAppTest.ShouldShowLocationBarForHostedApp/0
--HostedAppTest.ShouldShowLocationBarForHostedApp/1
+-HostedAppTest.*
 -IncognitoApiTest.IncognitoYesScript
 -IsolatedAppTest.CookieIsolation
 -IsolatedAppTest.CrossProcessClientRedirect
@@ -110,25 +87,14 @@
 -PageLoadMetricsBrowserTest.UseCounterFeaturesInIframes
 -PasswordManagerBrowserTestBase.SlowPageFill
 -PlatformAppBrowserTest.Isolation
--PluginPowerSaverBrowserTest.BackgroundTabPlugins
--PluginPowerSaverBrowserTest.BackgroundTabTinyPlugins
--PluginPowerSaverBrowserTest.BlockTinyPlugins
--PluginPowerSaverBrowserTest.EssentialPlugins
--PluginPowerSaverBrowserTest.ExpandingSmallPlugin
--PluginPowerSaverBrowserTest.ExpandingTinyPlugins
--PluginPowerSaverBrowserTest.LargePostersNotThrottled
--PluginPowerSaverBrowserTest.OriginWhitelisting
--PluginPowerSaverBrowserTest.PosterTests
--PluginPowerSaverBrowserTest.RunAllFlashInAllowMode
--PluginPowerSaverBrowserTest.SmallCrossOrigin
--PluginPowerSaverBrowserTest.SmallerThanPlayIcon
--PluginPowerSaverBrowserTest.ZoomIndependent
+-PluginPowerSaverBrowserTest.*
 -PolicyMakeDefaultBrowserTest.MakeDefaultDisabled
 -PolicyTest.CertificateTransparencyEnforcementDisabledForUrls
 -PolicyTest.SSLErrorOverridingAllowed
 -PolicyTest.SSLErrorOverridingDisallowed
 -PolicyTest.SafeBrowsingExtendedReportingOptInAllowed
 -PopupTrackerBrowserTest.ControlClick_HasTracker
+-PopupTrackerBrowserTest.ShiftClick_HasTracker
 -PredictorBrowserTest.CrossSiteRedirectPredictionWithNoPathDifferentHostName
 -ProcessManagementTest.ProcessOverflow
 -ProcessManagerBrowserTest.HostedAppAlerts
@@ -140,141 +106,9 @@
 -ReferrerPolicyTest.MiddleClickTargetBlankRedirect
 -ResourcePrefetchPredictorBrowserTest.SubresourceFcpOrder
 -SSLUICaptivePortalListResourceBundleTest.Enabled_DynamicUpdate/0
--SSLUITest.BadCertFollowedByGoodCert/0
--SSLUITest.ClientRedirectToMixedContentSSLState/0
--SSLUITest.ClientRedirectToMixedContentSSLState/1
--SSLUITest.DisplayedContentWithCertErrorsClearedOnNavigation/0
--SSLUITest.InAppTestHTTPSExpiredCertAndProceed/0
--SSLUITest.InterstitialNotAffectedByHideShow/0
--SSLUITest.OSReportsCaptivePortal/0
--SSLUITest.OSReportsCaptivePortal/1
--SSLUITest.OSReportsCaptivePortal_FeatureDisabled/0
--SSLUITest.OSReportsCaptivePortal_FeatureDisabled/1
--SSLUITest.ProceedLinkOverridable/0
--SSLUITest.SSLStatusMatchesOnInterstitialAndAfterProceed/0
--SSLUITest.SSLStatusMatchesonClockInterstitialAndAfterProceed/0
--SSLUITest.TestBadFrameNavigation/0
--SSLUITest.TestBadHTTPSDownload/0
--SSLUITest.TestBrokenHTTPSMetricsReporting_DontProceed/0
--SSLUITest.TestBrokenHTTPSMetricsReporting_Proceed/0
--SSLUITest.TestBrokenHTTPSWithActiveInsecureContent/0
--SSLUITest.TestBrokenHTTPSWithActiveInsecureContent/1
--SSLUITest.TestBrokenHTTPSWithInsecureContent/0
--SSLUITest.TestBrokenHTTPSWithInsecureContent/1
--SSLUITest.TestCloseTabWithUnsafePopup/0
--SSLUITest.TestDisplaysCachedInsecureContent/0
--SSLUITest.TestDisplaysCachedInsecureContent/1
--SSLUITest.TestDisplaysInsecureContent/0
--SSLUITest.TestDisplaysInsecureContent/1
--SSLUITest.TestDisplaysInsecureContentTwoTabs/0
--SSLUITest.TestDisplaysInsecureContentTwoTabs/1
--SSLUITest.TestHTTPSErrorCausedByClockUsingBuildTime/0
--SSLUITest.TestHTTPSErrorWithNoNavEntry/0
--SSLUITest.TestHTTPSExpiredCertAndGoBackViaButton/0
--SSLUITest.TestHTTPSExpiredCertAndGoBackViaMenu/0
--SSLUITest.TestHTTPSExpiredCertAndProceed/0
--SSLUITest.TestHTTPSExpiredCertGoBackUsingCommand/0
--SSLUITest.TestHTTPSOCSPOk/0
--SSLUITest.TestInterstitialCrossSiteNavigation/0
--SSLUITest.TestInterstitialCrossSiteNavigation/1
--SSLUITest.TestInterstitialLinksOpenInNewTab/0
--SSLUITest.TestRedirectGoodToBadHTTPS/0
--SSLUITest.TestRedirectHTTPToBadHTTPS/0
--SSLUITest.TestRefNavigation/0
--SSLUITest.TestRunsCachedInsecureContent/0
--SSLUITest.TestRunsCachedInsecureContent/1
--SSLUITest.TestRunsInsecureContentTwoTabs/0
--SSLUITest.TestRunsInsecureContentTwoTabs/1
--SSLUITest.TestRunsInsecuredContentRandomizeHash/0
--SSLUITest.TestRunsInsecuredContentRandomizeHash/1
--SSLUITest.TestUnsafeContentsWithUserException/0
--SSLUITest.TestUnsafeContentsWithUserException/1
--SSLUITest.TestUnsafeImageWithUserException/0
--SSLUITest.TestUnsafeImageWithUserException/1
--SSLUITest.TestWSSInvalidCert/0
--SSLUITest.TestWSSInvalidCert/1
--SSLUITestBase.TestHTTPSExpiredCertAndGoForward
--SSLUITestBase.TestInterstitialJavaScriptGoesBack
--SSLUITestBase.TestInterstitialJavaScriptProceeds
--SSLUITestBase.TestRedirectBadToGoodHTTPS
--SSLUITestIgnoreCertErrors.TestWSS/0
--SSLUITestIgnoreCertErrors.TestWSS/1
--SSLUITestIgnoreCertErrorsBySPKIHTTPS.TestHTTPS/0
--SSLUITestIgnoreCertErrorsBySPKIHTTPS.TestHTTPS/1
--SSLUITestIgnoreLocalhostCertErrors.TestNoInterstitialOnLocalhost/0
--SSLUITestIgnoreLocalhostCertErrors.TestNoInterstitialOnLocalhost/1
--SSLUITestWithExtendedReporting.TestBrokenHTTPSGoBackReporting/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSGoBackShowYesCheckNoParamYesReportNo/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSInIncognitoReportNo/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSNoReportingWhenDisallowed/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSProceedReporting/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSProceedReportingWithNoOptIn/0
--SSLUITestWithExtendedReporting.TestBrokenHTTPSReportingCloseTab/0
--SSLUIWorkerFetchTest.TestUnsafeContentsInWorkerWithUserException/0
--SSLUIWorkerFetchTest.TestUnsafeContentsInWorkerWithUserException/1
--SSLUIWorkerFetchTest.TestUnsafeContentsInWorkerWithUserException/2
--SSLUIWorkerFetchTest.TestUnsafeContentsInWorkerWithUserException/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeDontProceed/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeDontProceed/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeDontProceed/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeOptInAndReportThreatDetails/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeProceed/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeProceed/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeProceed/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeProceed/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.IframeProceed/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenDontProceed/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.MainFrameBlockedShouldHaveNoDOMDetailsWhenProceeding/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.RedirectCanceled/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateDowngradedForSubresourceInterstitial/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateDowngradedForSubresourceInterstitial/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateDowngradedForSubresourceInterstitial/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateDowngradedForSubresourceInterstitial/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateDowngradedForSubresourceInterstitial/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateGoBackOnSubresourceInterstitial/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityStateGoBackOnSubresourceInterstitial/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityState_InvalidHTTPS/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityState_InvalidHTTPS/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityState_InvalidHTTPS/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.SecurityState_InvalidHTTPS/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.VisitWhitePaper/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistIframeRevisit/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistRevisit/5
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/0
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/1
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/2
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/3
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/4
--SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.WhitelistUnsaved/5
+-SSLUITest*
+-SSLUIWorkerFetchTest.*
+-SafeBrowsingBlockingPageBrowserTestWithThreatTypeAndIsolationSetting/SafeBrowsingBlockingPageBrowserTest.*
 -SafeBrowsingTriggeredPopupBlockerBrowserTest.BlockOpenURLFromTab
 -SafeBrowsingTriggeredPopupBlockerBrowserTest.NoFeature_AllowCreatingNewWindows
 -SafeBrowsingTriggeredPopupBlockerBrowserTest.NoFeature_NoMessages
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 9853cb5b..70640838 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -3860,16 +3860,6 @@
       'Linux ASan LSan Tests (1)',
     ],
   },
-  'viz_content_browsertests': {
-    'remove_from': [
-      # TODO(dpranke): Remove this exception.
-      'Linux Tests SANDBOX',
-
-      # On chromium.linux, unclear why these only run on "Linux Tests".
-      'Linux Tests (dbg)(1)',
-      'Linux Tests (dbg)(1)(32)',
-    ],
-  },
   'viz_unittests': {
     'remove_from': [
       # On chromium.android, unclear why these aren't run on all bots.
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 7aff618..83f1ba9e 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -986,6 +986,7 @@
   'linux_viz_isolated_scripts': {
     'telemetry_perf_unittests': {
       'args': [
+        "--xvfb",
         '--extra-browser-args=--enable-viz',
       ],
       'swarming': {
@@ -996,9 +997,10 @@
     'telemetry_unittests': {
       'args': [
         '--extra-browser-args=--enable-viz',
-        '--skip=telemetry.internal.backends.chrome_inspector.inspector_page_unittest.InspectorPageTest.testCaptureScreenshot',
-        '--skip=telemetry.internal.browser.tab_unittest.GpuTabTest.testScreenshot',
         '--skip=telemetry.internal.actions.scroll_unittest.ScrollActionTest.testWheelScrollDistanceWhileZoomed',
+        '--skip=telemetry.internal.backends.chrome_inspector.inspector_page_unittest.InspectorPageTest.testCaptureScreenshot',
+        '--skip=telemetry.internal.backends.chrome.tab_list_backend_unittest.TabListBackendTest.testNewTab',
+        '--skip=telemetry.internal.browser.tab_unittest.GpuTabTest.testScreenshot',
         '--skip=telemetry.page.cache_temperature_unittest.CacheTemperatureTests.testEnsureHotAfterColdRun',
       ],
       'swarming': {
diff --git a/testing/libfuzzer/fuzzers/dicts/regexp.dict b/testing/libfuzzer/fuzzers/dicts/regexp.dict
index 963d44b3..f638a571 100644
--- a/testing/libfuzzer/fuzzers/dicts/regexp.dict
+++ b/testing/libfuzzer/fuzzers/dicts/regexp.dict
@@ -219,3 +219,21 @@
 "\x0f"
 "[-\xf0\x9f\x92\xa9]+"
 "[\xf0\x9f\x92\xa9-\xf4\x8f\xbf\xbf]"
+"(?<=)"
+"(?<=a)"
+"(?<!)"
+"(?<!a)"
+"(?<a>)"
+"(?<a>.)"
+"(?<a>.)\\k<a>"
+"\\p{Script=Greek}"
+"\\P{sc=Greek}"
+"\\p{Script_Extensions=Greek}"
+"\\P{scx=Greek}"
+"\\p{General_Category=Decimal_Number}"
+"\\P{gc=Decimal_Number}"
+"\\p{gc=Nd}"
+"\\P{Decimal_Number}"
+"\\p{Nd}"
+"\\P{Any}"
+"\\p{Changes_When_NFKC_Casefolded}"
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-cuetext.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-cuetext.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-cuetext.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-cuetext.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-header.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-header.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-header.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-header.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-note.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-note.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc031-cue-recovery-note.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/cue-recovery-note.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc032-degenerate-cues.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/degenerate-cues.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc032-degenerate-cues.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/degenerate-cues.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc027-empty-cue.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/empty-cue.vtt
similarity index 80%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc027-empty-cue.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/empty-cue.vtt
index 6deea4a..dbfde34 100644
--- a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc027-empty-cue.vtt
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/empty-cue.vtt
@@ -1,5 +1,5 @@
 WEBVTT
-Empty cues should be discarded and ignored.
+Empty cues should not be discarded.
 
 1
 00:00:00.000 --> 00:00:30.500 align:start position:20%
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc030-interspersed-non-cue.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/interspersed-non-cue.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc030-interspersed-non-cue.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/interspersed-non-cue.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc029-timings-whitespace.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/timings-whitespace.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc029-timings-whitespace.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/timings-whitespace.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc028-unsupported-markup.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/unsupported-markup.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc028-unsupported-markup.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/unsupported-markup.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc026-voice-bad.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/voice-bad.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc026-voice-bad.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/voice-bad.vtt
diff --git a/third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc026-voice.vtt b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/voice.vtt
similarity index 100%
rename from third_party/WebKit/LayoutTests/media/track/captions-webvtt/tc026-voice.vtt
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/resources/voice.vtt
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html
new file mode 100644
index 0000000..6a10491
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-cue-recovery.html
@@ -0,0 +1,19 @@
+<!DOCTYPE html>
+<title>A cue is recovered when a line with a "-->" is encountered without blank line separator</title>
+<script src="track-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+check_cues_from_track("resources/cue-recovery-header.vtt", testTrack);
+check_cues_from_track("resources/cue-recovery-note.vtt", testTrack);
+check_cues_from_track("resources/cue-recovery-cuetext.vtt", testTrack);
+
+function testTrack(track) {
+    var expected = [
+        { startTime: 0, endTime: 1, text: "Valid cue 1" },
+        { startTime: 2, endTime: 3, text: "Valid cue 2" }
+    ];
+
+    assert_cues_match(track.cues, expected);
+}
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html
new file mode 100644
index 0000000..8d256999
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-degenerate-cues.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<title>Degenerate cues without separating blank lines</title>
+<script src="track-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+check_cues_from_track("resources/degenerate-cues.vtt", function(track) {
+    var expected = [
+        { startTime: 0, endTime: 1, text: "" },
+        { startTime: 2, endTime: 3, text: "" },
+        { startTime: 4, endTime: 5, text: "" }
+    ];
+
+    assert_cues_match(track.cues, expected);
+});
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html
new file mode 100644
index 0000000..e1f5570
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-empty-cue.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<title>Empty cues should not be discarded</title>
+<script src="track-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+check_cues_from_track("resources/empty-cue.vtt", function(track) {
+    assert_equals(track.cues.length, 3);
+});
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html
new file mode 100644
index 0000000..2287cc28
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-interspersed-non-cue.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<title>An empty line after an identifier line discards the current cue and restarts the cue loop</title>
+<script src="track-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+check_cues_from_track("resources/interspersed-non-cue.vtt", function(track) {
+    var expected = [
+        { text: "First" },
+        { text: "Second" }
+    ];
+
+    assert_cues_match(track.cues, expected);
+});
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc029-timings-whitespace.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html
similarity index 82%
rename from third_party/WebKit/LayoutTests/media/track/track-webvtt-tc029-timings-whitespace.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html
index 83d1780..db1346d2 100644
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc029-timings-whitespace.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-timings-whitespace.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html>
-<title>Tests that "Skip whitespace" step around cue-timings separator is working correctly.</title>
+<title>"Skip whitespace" step around cue-timings separator</title>
 <script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script>
-check_cues_from_track("captions-webvtt/tc029-timings-whitespace.vtt", function(track) {
+check_cues_from_track("resources/timings-whitespace.vtt", function(track) {
     var expected = [
         { id: "1", startTime: 0.1, endTime: 1.5, text: "Single U+0020 SPACE left of cue-timings separator" },
         { id: "2", startTime: 0.1, endTime: 1.5, text: "Single U+0020 SPACE right of cue-timings separator" },
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html
new file mode 100644
index 0000000..ed3107f8
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-unsupported-markup.html
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<title>Unsupported markup is properly ignored</title>
+<script src="track-helpers.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script>
+var getCueAsHTMLContent = function(cue) {
+    return cue.getCueAsHTML().textContent;
+};
+
+check_cues_from_track("resources/unsupported-markup.vtt", function(track) {
+    var expected = [
+        {
+            innerHTML: getCueAsHTMLContent,
+            expected: "Bear is Coming!!!!!\nAnd what kind of a bear it is - just have look."
+        },
+        {
+            innerHTML: getCueAsHTMLContent,
+            expected: "\n  I said Bear is coming!!!!\n  I said Bear is still coming!!!!\n",
+        },
+        {
+            innerHTML: getCueAsHTMLContent,
+            expected: "\n  I said Bear is coming now!!!!\n  \n  \n",
+        }
+    ];
+
+    assert_cues_html_content(track.cues, expected);
+
+    var expected_text = [
+        { text: "<h1>Bear is Coming!!!!!</h1>\n<p>And what kind of a bear it is - just have <a href=\"webpage.html\">look</a>.</p>" },
+        { text: "<ul>\n  <li>I said Bear is coming!!!!</li>\n  <li>I said Bear is still coming!!!!</li>\n</ul>" },
+        { text: "<ol>\n  <li>I said Bear is coming now!!!!</li>\n  <li><img src=\"bear.png\" alt=\"mighty bear\"></li>\n  <li><video src=\"bear_ad.webm\" controls></video></li>\n</ol>" }
+    ];
+
+    assert_cues_match(track.cues, expected_text);
+});
+</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc026-voice.html b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html
similarity index 83%
rename from third_party/WebKit/LayoutTests/media/track/track-webvtt-tc026-voice.html
rename to third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html
index a32e92d5..5df8b40 100644
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc026-voice.html
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/semantics/embedded-content/media-elements/track/track-element/track-webvtt-voice.html
@@ -1,10 +1,10 @@
 <!DOCTYPE html>
-<title>Tests cues with voice markup &lt;v&gt;.</title>
+<title>Cues with voice markup &lt;v&gt;</title>
 <script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
 <script>
-check_cues_from_track("captions-webvtt/tc026-voice.vtt", function(track) {
+check_cues_from_track("resources/voice.vtt", function(track) {
     assert_equals(track.cues.length, 3);
 
     var children = [
@@ -29,7 +29,7 @@
     assert_cue_fragment(track.cues[2], children);
 });
 
-check_cues_from_track("captions-webvtt/tc026-voice-bad.vtt", function(track) {
+check_cues_from_track("resources/voice-bad.vtt", function(track) {
     assert_equals(track.cues.length, 3);
 
     var children = [
diff --git a/third_party/WebKit/LayoutTests/external/wpt/infrastructure/OWNERS b/third_party/WebKit/LayoutTests/external/wpt/infrastructure/OWNERS
index 066cce7d..49891ac8 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/infrastructure/OWNERS
+++ b/third_party/WebKit/LayoutTests/external/wpt/infrastructure/OWNERS
@@ -1,5 +1,6 @@
 # TEAM: ecosystem-infra@chromium.org
 # COMPONENT: Blink>Infra>Ecosystem
+# WPT-NOTIFY: true
 foolip@chromium.org
 robertma@chromium.org
 smcgruer@chromium.org
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc027-empty-cue.html b/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc027-empty-cue.html
deleted file mode 100644
index 6c21b6b..0000000
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc027-empty-cue.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<title>Tests that unsupported markup is properly ignored.</title>
-<script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-// TODO(srirama.m): Correct the title and vtt file description.
-check_cues_from_track("captions-webvtt/tc027-empty-cue.vtt", function(track) {
-    assert_equals(track.cues.length, 3);
-});
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc028-unsupported-markup.html b/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc028-unsupported-markup.html
deleted file mode 100644
index 711965fd..0000000
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc028-unsupported-markup.html
+++ /dev/null
@@ -1,32 +0,0 @@
-<!DOCTYPE html>
-<title>Tests that unsupported markup is properly ignored.</title>
-<script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-// TODO(srirama.m): Rewrite the test in a better way.
-// See https://codereview.chromium.org/2030383002/ for details.
-check_cues_from_track("captions-webvtt/tc028-unsupported-markup.vtt", function(track) {
-    var expected = [
-        {
-            innerHTML: "Bear is Coming!!!!!\nAnd what kind of a bear it is - just have look.",
-            text: "<h1>Bear is Coming!!!!!</h1>\n<p>And what kind of a bear it is - just have <a href=\"webpage.html\">look</a>.</p>"
-        },
-        {
-            innerHTML: "\n  I said Bear is coming!!!!\n  I said Bear is still coming!!!!\n",
-            text: "<ul>\n  <li>I said Bear is coming!!!!</li>\n  <li>I said Bear is still coming!!!!</li>\n</ul>"
-        },
-        {
-            innerHTML: "\n  I said Bear is coming now!!!!\n  \n  \n",
-            text: "<ol>\n  <li>I said Bear is coming now!!!!</li>\n  <li><img src=\"bear.png\" alt=\"mighty bear\"></li>\n  <li><video src=\"bear_ad.webm\" controls></video></li>\n</ol>"
-        }
-    ];
-
-    var cues = track.cues;
-    assert_equals(cues.length, expected.length);
-    for (var i = 0; i < cues.length; i++) {
-        assert_equals(cues[i].getCueAsHTML().textContent, expected[i].innerHTML);
-        assert_equals(cues[i].text, expected[i].text);
-    }
-});
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc030-interspersed-non-cue.html b/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc030-interspersed-non-cue.html
deleted file mode 100644
index ab5123b..0000000
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc030-interspersed-non-cue.html
+++ /dev/null
@@ -1,15 +0,0 @@
-<!DOCTYPE html>
-<title>Tests that an empty line after an identifier line discards the current cue and restarts the cue loop.</title>
-<script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-check_cues_from_track("captions-webvtt/tc030-interspersed-non-cue.vtt", function(track) {
-    var expected = [
-        { text: "First" },
-        { text: "Second" }
-    ];
-
-    assert_cues_match(track.cues, expected);
-});
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc031-cue-recovery.html b/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc031-cue-recovery.html
deleted file mode 100644
index ecd1884..0000000
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc031-cue-recovery.html
+++ /dev/null
@@ -1,19 +0,0 @@
-<!DOCTYPE html>
-<title>Tests that a cue is recovered when a line with a "-->" is encountered (missing blank line separator).</title>
-<script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-check_cues_from_track("captions-webvtt/tc031-cue-recovery-header.vtt", testTrack);
-check_cues_from_track("captions-webvtt/tc031-cue-recovery-note.vtt", testTrack);
-check_cues_from_track("captions-webvtt/tc031-cue-recovery-cuetext.vtt", testTrack);
-
-function testTrack(track) {
-    var expected = [
-        { startTime: 0, endTime: 1, text: "Valid cue 1" },
-        { startTime: 2, endTime: 3, text: "Valid cue 2" }
-    ];
-
-    assert_cues_match(track.cues, expected);
-}
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc032-degenerate-cues.html b/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc032-degenerate-cues.html
deleted file mode 100644
index 7d90b21..0000000
--- a/third_party/WebKit/LayoutTests/media/track/track-webvtt-tc032-degenerate-cues.html
+++ /dev/null
@@ -1,16 +0,0 @@
-<!DOCTYPE html>
-<title>Tests that a degenerate cues without separating blank lines are parsed correctly.</title>
-<script src="track-helpers.js"></script>
-<script src="../../resources/testharness.js"></script>
-<script src="../../resources/testharnessreport.js"></script>
-<script>
-check_cues_from_track("captions-webvtt/tc032-degenerate-cues.vtt", function(track) {
-    var expected = [
-        { startTime: 0, endTime: 1, text: "" },
-        { startTime: 2, endTime: 3, text: "" },
-        { startTime: 4, endTime: 5, text: "" }
-    ];
-
-    assert_cues_match(track.cues, expected);
-});
-</script>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser-expected.html b/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser-expected.html
new file mode 100644
index 0000000..f718ea6
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser-expected.html
@@ -0,0 +1,2 @@
+<!DOCTYPE html>
+<div style="width: 100px; height: 100px; background-color: green"></div>
diff --git a/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser.html b/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser.html
new file mode 100644
index 0000000..87455da
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/svg/custom/use-child-change-by-parser.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<svg>
+  <rect width="100" height="100" fill="red"/>
+  <use href="#foo"/>
+  <defs>
+    <g id="foo">
+      <rect width="50" height="100" fill="green"/>
+      <script>
+        // Force a layout so that the shadow tree is instantiated.
+      	document.documentElement.offsetTop;
+      </script>
+      <rect x="50" width="50" height="100" fill="green"/>
+    </g>
+  </defs>
+</svg>
diff --git a/third_party/WebKit/Source/build/scripts/core/css/css_properties.py b/third_party/WebKit/Source/build/scripts/core/css/css_properties.py
index 7e646855..e137f6dc 100755
--- a/third_party/WebKit/Source/build/scripts/core/css/css_properties.py
+++ b/third_party/WebKit/Source/build/scripts/core/css/css_properties.py
@@ -35,14 +35,15 @@
         assert not(property_to_check['interpolable']), \
             'Shorthand property (' + property_to_check['name'] + ') ' \
             'cannot be interpolable'
-    if property_to_check['longhands']:
-        assert 'parseSingleValue' not in property_to_check['property_methods'], \
-            'Shorthand property (' + property_to_check['name'] + ') ' \
-            'should not implement parseSingleValue'
-    else:
-        assert 'parseShorthand' not in property_to_check['property_methods'], \
-            'Longhand property (' + property_to_check['name'] + ') ' \
-            'should not implement parseShorthand'
+    if property_to_check['property_class'] is not None:
+        if property_to_check['longhands']:
+            assert 'parseSingleValue' not in property_to_check['property_methods'], \
+                'Shorthand property (' + property_to_check['name'] + ') ' \
+                'should not implement parseSingleValue'
+        else:
+            assert 'parseShorthand' not in property_to_check['property_methods'], \
+                'Longhand property (' + property_to_check['name'] + ') ' \
+                'should not implement parseShorthand'
     assert property_to_check['is_descriptor'] or \
         property_to_check['is_property'], \
         '{} must be a property, descriptor, or both'.format(
@@ -163,8 +164,8 @@
                 enum_for_css_property(alias['alias_for'])]
             updated_alias = aliased_property.copy()
             updated_alias['name'] = alias['name']
+            updated_alias['property_class'] = alias['property_class']
             updated_alias['alias_for'] = alias['alias_for']
-            updated_alias['aliased_property'] = aliased_property['upper_camel_name']
             updated_alias['property_id'] = enum_for_css_property_alias(
                 alias['name'])
             updated_alias['enum_value'] = aliased_property['enum_value'] + \
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_base.py b/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_base.py
index fd4e341..231b036d 100755
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_base.py
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_base.py
@@ -61,18 +61,33 @@
         self._alias_classes_by_id.sort(key=lambda t: t.enum_value)
 
     def get_class(self, property_):
-        """Gets the automatically
-        generated class name for a property.
+        """Gets the classname for a given property.
+
+        If the property has property_class set to True, returns an automatically
+        generated class name. If it is set to a string, returns that. If it is
+        set to None, returns the Longhand base class.
+
         Args:
             property_: A single property from CSSProperties.properties()
         Returns:
-            The name to use for the property class.
+            The name to use for the property class, or None.
         """
+        assert property_['property_class'] is True or \
+            property_['property_class'] is None or \
+            isinstance(property_['property_class'], str), \
+            "property_class value for {} should be None, True or a string".format(
+                property_['name'])
+        classname = property_['property_class']
         namespace_group = 'Shorthand' if property_['longhands'] else 'Longhand'
+        if property_['property_class'] is None:
+            classname = 'Longhand'
+            namespace_group = None
+        if property_['property_class'] is True:
+            classname = property_['upper_camel_name']
         return PropertyClassData(
             enum_value=property_['enum_value'],
             property_id=property_['property_id'],
-            classname=property_['upper_camel_name'],
+            classname=classname,
             namespace_group=namespace_group)
 
     @property
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_headers.py b/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_headers.py
index 8d12e14..7784ca5 100755
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_headers.py
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/make_css_property_headers.py
@@ -36,6 +36,7 @@
                 return_type=property_method['return_type'],
                 parameters=property_method['parameters'],
             )
+        self.validate_input()
 
         self._outputs = {}
         output_dir = sys.argv[sys.argv.index('--output_dir') + 1]
@@ -45,6 +46,10 @@
             properties = self.css_properties.shorthands
             namespace_group = 'Shorthand'
         for property_ in properties:
+            if property_['property_class'] is None:
+                continue
+            property_['unique'] = isinstance(
+                property_['property_class'], types.BooleanType)
             property_['property_methods'] = [
                 self._property_methods[method_name]
                 for method_name in property_['property_methods']
@@ -59,6 +64,9 @@
         for property_ in self.css_properties.aliases:
             if ('shorthands' in output_dir and property_['longhands']) or \
                ('longhands' in output_dir and not property_['longhands']):
+                if property_['property_class'] is None:
+                    continue
+                property_['unique'] = True
                 class_data = self.get_class(property_)
                 property_['namespace_group'] = namespace_group
                 self.populate_includes(property_)
@@ -79,9 +87,11 @@
 
     def calculate_apply_functions_to_declare(self, property_):
         # Functions should only be declared on the property classes if they are
-        # implemented.
+        # implemented and not shared (denoted by property_class = true. Shared
+        # classes are denoted by property_class = "some string").
         property_['should_declare_apply_functions'] = \
-            property_['is_property'] \
+            property_['unique'] \
+            and property_['is_property'] \
             and not property_['longhands'] \
             and not property_['direction_aware_options'] \
             and not property_['builder_skip']
@@ -154,5 +164,34 @@
         includes.sort()
         property_['includes'] = includes
 
+    def validate_input(self):
+        # First collect which classes correspond to which properties.
+        class_names_to_properties = defaultdict(list)
+        for property_ in self.css_properties.properties_including_aliases:
+            if property_['property_class'] is None:
+                continue
+            class_data = self.get_class(property_)
+            class_names_to_properties[class_data.classname].append(property_)
+        # Check that properties that share class names specify the same method
+        # names.
+        for properties in class_names_to_properties.values():
+            if len(properties) == 1:
+                assert properties[0]['property_class'] is True, 'Unique property_class ' \
+                    '{} defined on {}. property_class as a string is reserved for ' \
+                    'use with properties that share logic. Did you mean ' \
+                    'property_class: true?'.format(
+                        properties[0]['property_class'], properties[0]['name'])
+
+            property_methods = set(properties[0]['property_methods'])
+            for property_ in properties[1:]:
+                assert property_methods == set(property_['property_methods']), \
+                    'Properties {} and {} share the same property_class but do ' \
+                    'not declare the same property_methods. Properties sharing ' \
+                    'the same property_class must declare the same list of ' \
+                    'property_methods to ensure deterministic code ' \
+                    'generation.'.format(
+                        properties[0]['name'], property_['name'])
+
+
 if __name__ == '__main__':
     json5_generator.Maker(CSSPropertyHeadersWriter).main()
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSProperty.h.tmpl b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSProperty.h.tmpl
index 0b4238a5..8832a39 100644
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSProperty.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSProperty.h.tmpl
@@ -34,8 +34,11 @@
  public:
   CORE_EXPORT static const CSSProperty& Get(CSSPropertyID);
 
+  explicit constexpr CSSProperty(CSSPropertyID id) : CSSUnresolvedProperty(id) {}
+
   bool IsResolvedProperty() const override { return true; }
   WTF::String GetJSPropertyName() const;
+
   virtual bool IsInterpolable() const { return false; }
   virtual bool IsInherited() const { return false; }
   virtual bool IsCompositableProperty() const { return false; }
@@ -69,8 +72,6 @@
                                                    Vector<const CSSProperty*>&);
 
  protected:
-  constexpr CSSProperty() : CSSUnresolvedProperty() {}
-
   static const StylePropertyShorthand& BorderDirections();
   static const CSSProperty& ResolveAfterToPhysicalProperty(
       TextDirection,
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSPropertySubclass.h.tmpl b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSPropertySubclass.h.tmpl
index 6789fe1..6dd13f71 100644
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSPropertySubclass.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSPropertySubclass.h.tmpl
@@ -20,26 +20,35 @@
 namespace CSS{{property.namespace_group}} {
 
 {% if property.is_property %}
+  {% if property.unique %}
 // Implements the '{{property.name}}' CSS property
+  {% else %}
+// Implements multiple CSS properties
+  {% endif %}
 {% else %}
+  {% if property.unique %}
 // Implements the '{{property.name}}' CSS descriptor
+  {% else %}
+// Implements multiple CSS descriptors
+  {% endif %}
 {% endif %}
 // See src/third_party/WebKit/Source/core/css/properties/README.md
   {% if property.alias_for != None%}
-class {{property_classname}} final : public CSSUnresolvedProperty {
+class {{property_classname}} : public CSSUnresolvedProperty {
  public:
-  constexpr {{property_classname}}() : CSSUnresolvedProperty() {}
+  constexpr {{property_classname}}(CSSPropertyID id) : CSSUnresolvedProperty(id) {}
   {% else %}
-class {{property_classname}} final : public {{property.namespace_group}} {
+class {{property_classname}} : public {{property.namespace_group}} {
  public:
-  constexpr {{property_classname}}() : {{property.namespace_group}}() {}
+  constexpr {{property_classname}}(CSSPropertyID id) : {{property.namespace_group}}(id) {}
   {% endif %}
-  CSSPropertyID PropertyID() const override { return {{property.property_id}}; }
+  {% if property.unique %}
   const char* GetPropertyName() const override { return "{{property.name}}\0"; }
   const WTF::AtomicString& GetPropertyNameAtomicString() const override {
     static const WTF::AtomicString& name = WTF::AtomicString("{{property.name}}\0");
     return name;
   }
+  {% endif %}
   {% if property.alias_for == None %}
   {% for property_method in property.property_methods %}
   {{property_method.return_type}} {{property_method.name}}{{property_method.parameters}} const override;
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.cpp.tmpl b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.cpp.tmpl
index 32dcd26f..8708bd17 100644
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.cpp.tmpl
@@ -21,12 +21,16 @@
 namespace blink {
 namespace {
 
-static constexpr Variable property_csspropertyvariable;
+static constexpr Variable property_csspropertyvariable(CSSPropertyVariable);
 {% for _, property_id, classname, namespace_group in property_classes_by_property_id %}
-static constexpr CSS{{namespace_group}}::{{classname}} property_{{property_id.lower()}};
+  {% if namespace_group != None %}
+static constexpr CSS{{namespace_group}}::{{classname}} property_{{property_id.lower()}}({{property_id}});
+  {% else %}
+static constexpr {{classname}} property_{{property_id.lower()}}({{property_id}});
+  {% endif %}
 {% endfor %}
 {% for _, property_id, classname, namespace_group in alias_classes_by_property_id %}
-static constexpr CSS{{namespace_group}}::{{classname}} property_{{property_id.lower()}};
+static constexpr CSS{{namespace_group}}::{{classname}} property_{{property_id.lower()}}({{property_id}});
 {% endfor %}
 
 } // namespace
diff --git a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.h.tmpl b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.h.tmpl
index f9f0a0cf..0331ce7c 100644
--- a/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/core/css/properties/templates/CSSUnresolvedProperty.h.tmpl
@@ -21,22 +21,17 @@
  public:
   CORE_EXPORT static const CSSUnresolvedProperty& Get(CSSPropertyID);
 
+  explicit constexpr CSSUnresolvedProperty(CSSPropertyID id) : id_(id) {}
+
   // For backwards compatibility when passing around CSSUnresolvedProperty
   // references. In case we need to call a function that hasn't been converted
   // to using property classes yet.
-  virtual CSSPropertyID PropertyID() const {
-    NOTREACHED();
-    return CSSPropertyInvalid;
-  }
-  bool IDEquals(CSSPropertyID id) const { return PropertyID() == id; }
+  CSSPropertyID PropertyID() const { return id_; }
+  bool IDEquals(CSSPropertyID id) const { return id_ == id; }
   virtual bool IsResolvedProperty() const { return false; }
-  virtual const char* GetPropertyName() const {
-    NOTREACHED();
-    return nullptr;
-  }
+  virtual const char* GetPropertyName() const { return getPropertyName(id_); }
   virtual const WTF::AtomicString& GetPropertyNameAtomicString() const {
-    NOTREACHED();
-    return g_empty_atom;
+    return getPropertyNameAtomicString(id_);
   }
   WTF::String GetPropertyNameString() const {
     // We share the StringImpl with the AtomicStrings.
@@ -50,8 +45,10 @@
 
   CORE_EXPORT static const CSSUnresolvedProperty* GetAliasProperty(CSSPropertyID);
 
+ private:
+  const CSSPropertyID id_;
+
  protected:
-  constexpr CSSUnresolvedProperty() {}
   static const CSSUnresolvedProperty& GetNonAliasProperty(CSSPropertyID);
 };
 
diff --git a/third_party/WebKit/Source/build/scripts/make_style_builder.py b/third_party/WebKit/Source/build/scripts/make_style_builder.py
index ddb6b5e..ac7aa2b 100755
--- a/third_party/WebKit/Source/build/scripts/make_style_builder.py
+++ b/third_party/WebKit/Source/build/scripts/make_style_builder.py
@@ -42,11 +42,16 @@
         and not property_['direction_aware_options'] \
         and not property_['builder_skip'] \
         and property_['is_property']
+    # Functions should only be used in StyleBuilder if the CSSProperty
+    # class is shared or not implemented yet (shared classes are denoted by
+    # property_class = "some string").
     property_['use_property_class_in_stylebuilder'] = \
         property_['should_declare_functions'] \
         and not (property_['custom_apply_functions_initial'] or
                  property_['custom_apply_functions_inherit'] or
-                 property_['custom_apply_functions_value'])
+                 property_['custom_apply_functions_value']) \
+        and property_['property_class'] \
+        and isinstance(property_['property_class'], types.BooleanType)
     # TODO(crbug.com/751354): Remove this hard coded list of supported
     # properties once all of them have been implemented
     if property_['custom_apply_functions_all']:
diff --git a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.cpp.tmpl
index c7f1c50..ebe5b9a 100644
--- a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.cpp.tmpl
@@ -25,6 +25,18 @@
 #endif
 
 namespace blink {
+static const char propertyNameStringsPool[] = {
+{% for name in property_names %}
+  "{{name}}\0"
+{% endfor %}
+};
+
+static const unsigned short propertyNameStringsOffsets[] = {
+{% for offset in property_offsets %}
+  {{offset}},
+{% endfor %}
+};
+
 %}
 %struct-type
 struct Property;
@@ -51,6 +63,25 @@
   return {{class_name}}Hash::findPropertyImpl(str, len);
 }
 
+const char* getPropertyName(CSSPropertyID id) {
+  DCHECK(isCSSPropertyIDWithName(id));
+  int index = id - firstCSSProperty;
+  return propertyNameStringsPool + propertyNameStringsOffsets[index];
+}
+
+const AtomicString& getPropertyNameAtomicString(CSSPropertyID id) {
+  DCHECK(isCSSPropertyIDWithName(id));
+  int index = id - firstCSSProperty;
+  static AtomicString* propertyStrings =
+      new AtomicString[lastUnresolvedCSSProperty]; // Leaked.
+  AtomicString& propertyString = propertyStrings[index];
+  if (propertyString.IsNull()) {
+    propertyString = AtomicString(propertyNameStringsPool +
+                     propertyNameStringsOffsets[index]);
+  }
+  return propertyString;
+}
+
 CSSPropertyID cssPropertyID(const String& string)
 {
     return resolveCSSPropertyID(unresolvedCSSPropertyID(string));
diff --git a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.h.tmpl
index 1fe1ddc4..b99b8a0 100644
--- a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyNames.h.tmpl
@@ -32,6 +32,9 @@
 const int numCSSPropertyIDs = lastUnresolvedCSSProperty + 1;
 const size_t maxCSSPropertyNameLength = {{max_name_length}};
 
+CORE_EXPORT const char* getPropertyName(CSSPropertyID);
+CORE_EXPORT const WTF::AtomicString& getPropertyNameAtomicString(CSSPropertyID);
+
 inline bool isCSSPropertyIDWithName(int id)
 {
     return id >= firstCSSProperty && id <= lastUnresolvedCSSProperty;
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index a2c5b749..58022c99 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -542,66 +542,41 @@
     "../build/scripts/core/css/properties/templates/CSSPropertySubclass.h.tmpl",
   ]
   outputs = [
-    "$blink_core_output_dir/css/properties/longhands/AlignContent.h",
     "$blink_core_output_dir/css/properties/longhands/AlignItems.h",
-    "$blink_core_output_dir/css/properties/longhands/AlignmentBaseline.h",
+    "$blink_core_output_dir/css/properties/longhands/AlignOrJustifyContent.h",
     "$blink_core_output_dir/css/properties/longhands/AlignSelf.h",
     "$blink_core_output_dir/css/properties/longhands/All.h",
-    "$blink_core_output_dir/css/properties/longhands/AnimationDelay.h",
     "$blink_core_output_dir/css/properties/longhands/AnimationDirection.h",
-    "$blink_core_output_dir/css/properties/longhands/AnimationDuration.h",
     "$blink_core_output_dir/css/properties/longhands/AnimationFillMode.h",
     "$blink_core_output_dir/css/properties/longhands/AnimationIterationCount.h",
     "$blink_core_output_dir/css/properties/longhands/AnimationName.h",
     "$blink_core_output_dir/css/properties/longhands/AnimationPlayState.h",
-    "$blink_core_output_dir/css/properties/longhands/AnimationTimingFunction.h",
+    "$blink_core_output_dir/css/properties/longhands/AutoOrString.h",
     "$blink_core_output_dir/css/properties/longhands/BackdropFilter.h",
     "$blink_core_output_dir/css/properties/longhands/BackfaceVisibility.h",
     "$blink_core_output_dir/css/properties/longhands/BackgroundAttachment.h",
     "$blink_core_output_dir/css/properties/longhands/BackgroundBlendMode.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundClip.h",
+    "$blink_core_output_dir/css/properties/longhands/BackgroundBox.h",
     "$blink_core_output_dir/css/properties/longhands/BackgroundColor.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundImage.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundOrigin.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundPositionX.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundPositionY.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundRepeatX.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundRepeatY.h",
-    "$blink_core_output_dir/css/properties/longhands/BackgroundSize.h",
+    "$blink_core_output_dir/css/properties/longhands/BackgroundOrMaskImage.h",
+    "$blink_core_output_dir/css/properties/longhands/BackgroundOrMaskSize.h",
     "$blink_core_output_dir/css/properties/longhands/BaselineShift.h",
-    "$blink_core_output_dir/css/properties/longhands/BlockSize.h",
+    "$blink_core_output_dir/css/properties/longhands/BlockSizeOrLogicalHeight.h",
     "$blink_core_output_dir/css/properties/longhands/BorderBottomColor.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderBottomLeftRadius.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderBottomRightRadius.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderBottomStyle.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderBottomWidth.h",
     "$blink_core_output_dir/css/properties/longhands/BorderCollapse.h",
     "$blink_core_output_dir/css/properties/longhands/BorderImageOutset.h",
     "$blink_core_output_dir/css/properties/longhands/BorderImageRepeat.h",
     "$blink_core_output_dir/css/properties/longhands/BorderImageSlice.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderImageSource.h",
     "$blink_core_output_dir/css/properties/longhands/BorderImageWidth.h",
     "$blink_core_output_dir/css/properties/longhands/BorderLeftColor.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderLeftStyle.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderLeftWidth.h",
+    "$blink_core_output_dir/css/properties/longhands/BorderRadiusCorner.h",
     "$blink_core_output_dir/css/properties/longhands/BorderRightColor.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderRightStyle.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderRightWidth.h",
     "$blink_core_output_dir/css/properties/longhands/BorderTopColor.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderTopLeftRadius.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderTopRightRadius.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderTopStyle.h",
-    "$blink_core_output_dir/css/properties/longhands/BorderTopWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/Bottom.h",
+    "$blink_core_output_dir/css/properties/longhands/BorderWidthSide.h",
     "$blink_core_output_dir/css/properties/longhands/BoxShadow.h",
     "$blink_core_output_dir/css/properties/longhands/BoxSizing.h",
-    "$blink_core_output_dir/css/properties/longhands/BreakAfter.h",
-    "$blink_core_output_dir/css/properties/longhands/BreakBefore.h",
-    "$blink_core_output_dir/css/properties/longhands/BreakInside.h",
-    "$blink_core_output_dir/css/properties/longhands/BufferedRendering.h",
     "$blink_core_output_dir/css/properties/longhands/CaptionSide.h",
     "$blink_core_output_dir/css/properties/longhands/CaretColor.h",
-    "$blink_core_output_dir/css/properties/longhands/Clear.h",
     "$blink_core_output_dir/css/properties/longhands/Clip.h",
     "$blink_core_output_dir/css/properties/longhands/ClipPath.h",
     "$blink_core_output_dir/css/properties/longhands/ClipRule.h",
@@ -610,7 +585,6 @@
     "$blink_core_output_dir/css/properties/longhands/ColorInterpolationFilters.h",
     "$blink_core_output_dir/css/properties/longhands/ColorRendering.h",
     "$blink_core_output_dir/css/properties/longhands/ColumnCount.h",
-    "$blink_core_output_dir/css/properties/longhands/ColumnFill.h",
     "$blink_core_output_dir/css/properties/longhands/ColumnGap.h",
     "$blink_core_output_dir/css/properties/longhands/ColumnRuleColor.h",
     "$blink_core_output_dir/css/properties/longhands/ColumnRuleStyle.h",
@@ -622,12 +596,12 @@
     "$blink_core_output_dir/css/properties/longhands/CounterIncrement.h",
     "$blink_core_output_dir/css/properties/longhands/CounterReset.h",
     "$blink_core_output_dir/css/properties/longhands/Cursor.h",
-    "$blink_core_output_dir/css/properties/longhands/Cx.h",
-    "$blink_core_output_dir/css/properties/longhands/Cy.h",
     "$blink_core_output_dir/css/properties/longhands/D.h",
+    "$blink_core_output_dir/css/properties/longhands/Delay.h",
+    "$blink_core_output_dir/css/properties/longhands/DescriptorOnly.h",
     "$blink_core_output_dir/css/properties/longhands/Direction.h",
-    "$blink_core_output_dir/css/properties/longhands/Display.h",
     "$blink_core_output_dir/css/properties/longhands/DominantBaseline.h",
+    "$blink_core_output_dir/css/properties/longhands/Duration.h",
     "$blink_core_output_dir/css/properties/longhands/EmptyCells.h",
     "$blink_core_output_dir/css/properties/longhands/EpubCaptionSide.h",
     "$blink_core_output_dir/css/properties/longhands/EpubTextCombine.h",
@@ -637,18 +611,15 @@
     "$blink_core_output_dir/css/properties/longhands/EpubTextTransform.h",
     "$blink_core_output_dir/css/properties/longhands/EpubWordBreak.h",
     "$blink_core_output_dir/css/properties/longhands/EpubWritingMode.h",
-    "$blink_core_output_dir/css/properties/longhands/Fill.h",
-    "$blink_core_output_dir/css/properties/longhands/FillOpacity.h",
+    "$blink_core_output_dir/css/properties/longhands/FillOrStrokeOpacity.h",
     "$blink_core_output_dir/css/properties/longhands/FillRule.h",
     "$blink_core_output_dir/css/properties/longhands/Filter.h",
     "$blink_core_output_dir/css/properties/longhands/FlexBasis.h",
     "$blink_core_output_dir/css/properties/longhands/FlexDirection.h",
-    "$blink_core_output_dir/css/properties/longhands/FlexGrow.h",
-    "$blink_core_output_dir/css/properties/longhands/FlexShrink.h",
+    "$blink_core_output_dir/css/properties/longhands/FlexGrowOrShrink.h",
     "$blink_core_output_dir/css/properties/longhands/FlexWrap.h",
-    "$blink_core_output_dir/css/properties/longhands/Float.h",
     "$blink_core_output_dir/css/properties/longhands/FloodColor.h",
-    "$blink_core_output_dir/css/properties/longhands/FloodOpacity.h",
+    "$blink_core_output_dir/css/properties/longhands/FloodOrStopOpacity.h",
     "$blink_core_output_dir/css/properties/longhands/FontDisplay.h",
     "$blink_core_output_dir/css/properties/longhands/FontFamily.h",
     "$blink_core_output_dir/css/properties/longhands/FontFeatureSettings.h",
@@ -663,29 +634,20 @@
     "$blink_core_output_dir/css/properties/longhands/FontVariantNumeric.h",
     "$blink_core_output_dir/css/properties/longhands/FontVariationSettings.h",
     "$blink_core_output_dir/css/properties/longhands/FontWeight.h",
-    "$blink_core_output_dir/css/properties/longhands/GridAutoColumns.h",
     "$blink_core_output_dir/css/properties/longhands/GridAutoFlow.h",
-    "$blink_core_output_dir/css/properties/longhands/GridAutoRows.h",
-    "$blink_core_output_dir/css/properties/longhands/GridColumnEnd.h",
-    "$blink_core_output_dir/css/properties/longhands/GridColumnGap.h",
-    "$blink_core_output_dir/css/properties/longhands/GridColumnStart.h",
-    "$blink_core_output_dir/css/properties/longhands/GridRowEnd.h",
-    "$blink_core_output_dir/css/properties/longhands/GridRowGap.h",
-    "$blink_core_output_dir/css/properties/longhands/GridRowStart.h",
+    "$blink_core_output_dir/css/properties/longhands/GridAutoLine.h",
+    "$blink_core_output_dir/css/properties/longhands/GridLine.h",
+    "$blink_core_output_dir/css/properties/longhands/GridRowOrColumnGap.h",
     "$blink_core_output_dir/css/properties/longhands/GridTemplateAreas.h",
-    "$blink_core_output_dir/css/properties/longhands/GridTemplateColumns.h",
-    "$blink_core_output_dir/css/properties/longhands/GridTemplateRows.h",
-    "$blink_core_output_dir/css/properties/longhands/Height.h",
+    "$blink_core_output_dir/css/properties/longhands/GridTemplateLine.h",
     "$blink_core_output_dir/css/properties/longhands/Hyphens.h",
     "$blink_core_output_dir/css/properties/longhands/ImageOrientation.h",
     "$blink_core_output_dir/css/properties/longhands/ImageRendering.h",
-    "$blink_core_output_dir/css/properties/longhands/InlineSize.h",
-    "$blink_core_output_dir/css/properties/longhands/Isolation.h",
-    "$blink_core_output_dir/css/properties/longhands/JustifyContent.h",
+    "$blink_core_output_dir/css/properties/longhands/ImageSource.h",
+    "$blink_core_output_dir/css/properties/longhands/InlineSizeOrLogicalWidth.h",
     "$blink_core_output_dir/css/properties/longhands/JustifyItems.h",
     "$blink_core_output_dir/css/properties/longhands/JustifySelf.h",
-    "$blink_core_output_dir/css/properties/longhands/Left.h",
-    "$blink_core_output_dir/css/properties/longhands/LetterSpacing.h",
+    "$blink_core_output_dir/css/properties/longhands/LetterAndWordSpacing.h",
     "$blink_core_output_dir/css/properties/longhands/LightingColor.h",
     "$blink_core_output_dir/css/properties/longhands/LineBreak.h",
     "$blink_core_output_dir/css/properties/longhands/LineHeight.h",
@@ -697,100 +659,74 @@
     "$blink_core_output_dir/css/properties/longhands/MarginLeft.h",
     "$blink_core_output_dir/css/properties/longhands/MarginRight.h",
     "$blink_core_output_dir/css/properties/longhands/MarginTop.h",
-    "$blink_core_output_dir/css/properties/longhands/MarkerEnd.h",
-    "$blink_core_output_dir/css/properties/longhands/MarkerMid.h",
-    "$blink_core_output_dir/css/properties/longhands/MarkerStart.h",
+    "$blink_core_output_dir/css/properties/longhands/MarkerPoint.h",
     "$blink_core_output_dir/css/properties/longhands/Mask.h",
     "$blink_core_output_dir/css/properties/longhands/MaskSourceType.h",
-    "$blink_core_output_dir/css/properties/longhands/MaskType.h",
-    "$blink_core_output_dir/css/properties/longhands/MaxBlockSize.h",
-    "$blink_core_output_dir/css/properties/longhands/MaxHeight.h",
-    "$blink_core_output_dir/css/properties/longhands/MaxInlineSize.h",
-    "$blink_core_output_dir/css/properties/longhands/MaxWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/MaxZoom.h",
-    "$blink_core_output_dir/css/properties/longhands/MinBlockSize.h",
-    "$blink_core_output_dir/css/properties/longhands/MinHeight.h",
-    "$blink_core_output_dir/css/properties/longhands/MinInlineSize.h",
-    "$blink_core_output_dir/css/properties/longhands/MinWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/MinZoom.h",
-    "$blink_core_output_dir/css/properties/longhands/MixBlendMode.h",
-    "$blink_core_output_dir/css/properties/longhands/ObjectFit.h",
+    "$blink_core_output_dir/css/properties/longhands/MaxBlockSizeOrMaxLogicalHeight.h",
+    "$blink_core_output_dir/css/properties/longhands/MaxInlineSizeOrMaxLogicalWidth.h",
+    "$blink_core_output_dir/css/properties/longhands/MaxWidthOrHeight.h",
+    "$blink_core_output_dir/css/properties/longhands/MinBlockSizeOrMinLogicalHeight.h",
+    "$blink_core_output_dir/css/properties/longhands/MinInlineSizeOrMinLogicalWidth.h",
+    "$blink_core_output_dir/css/properties/longhands/MinWidthOrHeight.h",
     "$blink_core_output_dir/css/properties/longhands/ObjectPosition.h",
     "$blink_core_output_dir/css/properties/longhands/OffsetAnchor.h",
     "$blink_core_output_dir/css/properties/longhands/OffsetDistance.h",
     "$blink_core_output_dir/css/properties/longhands/OffsetPath.h",
     "$blink_core_output_dir/css/properties/longhands/OffsetPosition.h",
     "$blink_core_output_dir/css/properties/longhands/OffsetRotate.h",
+    "$blink_core_output_dir/css/properties/longhands/OffsetSide.h",
     "$blink_core_output_dir/css/properties/longhands/Opacity.h",
     "$blink_core_output_dir/css/properties/longhands/Order.h",
-    "$blink_core_output_dir/css/properties/longhands/Orientation.h",
-    "$blink_core_output_dir/css/properties/longhands/Orphans.h",
+    "$blink_core_output_dir/css/properties/longhands/OrphansOrWidows.h",
     "$blink_core_output_dir/css/properties/longhands/OutlineColor.h",
     "$blink_core_output_dir/css/properties/longhands/OutlineOffset.h",
-    "$blink_core_output_dir/css/properties/longhands/OutlineStyle.h",
     "$blink_core_output_dir/css/properties/longhands/OutlineWidth.h",
     "$blink_core_output_dir/css/properties/longhands/OverflowAnchor.h",
     "$blink_core_output_dir/css/properties/longhands/OverflowWrap.h",
-    "$blink_core_output_dir/css/properties/longhands/OverflowX.h",
-    "$blink_core_output_dir/css/properties/longhands/OverflowY.h",
-    "$blink_core_output_dir/css/properties/longhands/OverscrollBehaviorX.h",
-    "$blink_core_output_dir/css/properties/longhands/OverscrollBehaviorY.h",
+    "$blink_core_output_dir/css/properties/longhands/OverscrollBehaviorXOrY.h",
     "$blink_core_output_dir/css/properties/longhands/PaddingBottom.h",
     "$blink_core_output_dir/css/properties/longhands/PaddingLeft.h",
     "$blink_core_output_dir/css/properties/longhands/PaddingRight.h",
     "$blink_core_output_dir/css/properties/longhands/PaddingTop.h",
     "$blink_core_output_dir/css/properties/longhands/Page.h",
     "$blink_core_output_dir/css/properties/longhands/PaintOrder.h",
+    "$blink_core_output_dir/css/properties/longhands/PaintStroke.h",
     "$blink_core_output_dir/css/properties/longhands/Perspective.h",
     "$blink_core_output_dir/css/properties/longhands/PerspectiveOrigin.h",
     "$blink_core_output_dir/css/properties/longhands/PointerEvents.h",
-    "$blink_core_output_dir/css/properties/longhands/Position.h",
+    "$blink_core_output_dir/css/properties/longhands/PositionX.h",
+    "$blink_core_output_dir/css/properties/longhands/PositionY.h",
     "$blink_core_output_dir/css/properties/longhands/Quotes.h",
-    "$blink_core_output_dir/css/properties/longhands/R.h",
-    "$blink_core_output_dir/css/properties/longhands/Resize.h",
-    "$blink_core_output_dir/css/properties/longhands/Right.h",
+    "$blink_core_output_dir/css/properties/longhands/Radius.h",
     "$blink_core_output_dir/css/properties/longhands/Rotate.h",
-    "$blink_core_output_dir/css/properties/longhands/Rx.h",
-    "$blink_core_output_dir/css/properties/longhands/Ry.h",
     "$blink_core_output_dir/css/properties/longhands/Scale.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollBehavior.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollPaddingBlockEnd.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollPaddingBlockStart.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollPaddingBottom.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollPaddingInlineEnd.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollPaddingInlineStart.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollPaddingLeft.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollPaddingRight.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollPaddingTop.h",
+    "$blink_core_output_dir/css/properties/longhands/ScrollPaddingSide.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapAlign.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginBlockEnd.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginBlockStart.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginBottom.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginInlineEnd.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginInlineStart.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginLeft.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginRight.h",
-    "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginTop.h",
+    "$blink_core_output_dir/css/properties/longhands/ScrollSnapMarginSide.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapStop.h",
     "$blink_core_output_dir/css/properties/longhands/ScrollSnapType.h",
     "$blink_core_output_dir/css/properties/longhands/ShapeImageThreshold.h",
+    "$blink_core_output_dir/css/properties/longhands/ShapeLength.h",
     "$blink_core_output_dir/css/properties/longhands/ShapeMargin.h",
     "$blink_core_output_dir/css/properties/longhands/ShapeOutside.h",
     "$blink_core_output_dir/css/properties/longhands/ShapeRendering.h",
     "$blink_core_output_dir/css/properties/longhands/Size.h",
     "$blink_core_output_dir/css/properties/longhands/Speak.h",
-    "$blink_core_output_dir/css/properties/longhands/Src.h",
     "$blink_core_output_dir/css/properties/longhands/StopColor.h",
-    "$blink_core_output_dir/css/properties/longhands/StopOpacity.h",
-    "$blink_core_output_dir/css/properties/longhands/Stroke.h",
     "$blink_core_output_dir/css/properties/longhands/StrokeDasharray.h",
-    "$blink_core_output_dir/css/properties/longhands/StrokeDashoffset.h",
+    "$blink_core_output_dir/css/properties/longhands/StrokeDashoffsetOrStrokeWidth.h",
     "$blink_core_output_dir/css/properties/longhands/StrokeLinecap.h",
     "$blink_core_output_dir/css/properties/longhands/StrokeLinejoin.h",
     "$blink_core_output_dir/css/properties/longhands/StrokeMiterlimit.h",
-    "$blink_core_output_dir/css/properties/longhands/StrokeOpacity.h",
-    "$blink_core_output_dir/css/properties/longhands/StrokeWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/TableLayout.h",
     "$blink_core_output_dir/css/properties/longhands/TabSize.h",
     "$blink_core_output_dir/css/properties/longhands/TextAlign.h",
     "$blink_core_output_dir/css/properties/longhands/TextAlignLast.h",
@@ -802,28 +738,21 @@
     "$blink_core_output_dir/css/properties/longhands/TextIndent.h",
     "$blink_core_output_dir/css/properties/longhands/TextJustify.h",
     "$blink_core_output_dir/css/properties/longhands/TextOrientation.h",
-    "$blink_core_output_dir/css/properties/longhands/TextOverflow.h",
     "$blink_core_output_dir/css/properties/longhands/TextRendering.h",
     "$blink_core_output_dir/css/properties/longhands/TextShadow.h",
     "$blink_core_output_dir/css/properties/longhands/TextSizeAdjust.h",
     "$blink_core_output_dir/css/properties/longhands/TextTransform.h",
     "$blink_core_output_dir/css/properties/longhands/TextUnderlinePosition.h",
-    "$blink_core_output_dir/css/properties/longhands/Top.h",
+    "$blink_core_output_dir/css/properties/longhands/TimingFunction.h",
     "$blink_core_output_dir/css/properties/longhands/TouchAction.h",
     "$blink_core_output_dir/css/properties/longhands/Transform.h",
     "$blink_core_output_dir/css/properties/longhands/TransformBox.h",
     "$blink_core_output_dir/css/properties/longhands/TransformOrigin.h",
     "$blink_core_output_dir/css/properties/longhands/TransformStyle.h",
-    "$blink_core_output_dir/css/properties/longhands/TransitionDelay.h",
-    "$blink_core_output_dir/css/properties/longhands/TransitionDuration.h",
     "$blink_core_output_dir/css/properties/longhands/TransitionProperty.h",
-    "$blink_core_output_dir/css/properties/longhands/TransitionTimingFunction.h",
     "$blink_core_output_dir/css/properties/longhands/Translate.h",
     "$blink_core_output_dir/css/properties/longhands/UnicodeBidi.h",
-    "$blink_core_output_dir/css/properties/longhands/UnicodeRange.h",
     "$blink_core_output_dir/css/properties/longhands/UserSelect.h",
-    "$blink_core_output_dir/css/properties/longhands/UserZoom.h",
-    "$blink_core_output_dir/css/properties/longhands/VectorEffect.h",
     "$blink_core_output_dir/css/properties/longhands/VerticalAlign.h",
     "$blink_core_output_dir/css/properties/longhands/Visibility.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitAlignContent.h",
@@ -837,8 +766,6 @@
     "$blink_core_output_dir/css/properties/longhands/WebkitAnimationName.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitAnimationPlayState.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitAnimationTimingFunction.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitAppearance.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitAppRegion.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBackfaceVisibility.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBackgroundClip.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBackgroundOrigin.h",
@@ -854,23 +781,17 @@
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderEndColor.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderEndStyle.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderEndWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBorderHorizontalSpacing.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderImage.h",
+    "$blink_core_output_dir/css/properties/longhands/WebkitBorderSpacing.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderStartColor.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderStartStyle.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderStartWidth.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderTopLeftRadius.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBorderTopRightRadius.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBorderVerticalSpacing.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBoxAlign.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBoxDecorationBreak.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxDirection.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxFlex.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxFlexGroup.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBoxLines.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxOrdinalGroup.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBoxOrient.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitBoxPack.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxReflect.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxShadow.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitBoxSizing.h",
@@ -892,39 +813,20 @@
     "$blink_core_output_dir/css/properties/longhands/WebkitFontSizeDelta.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitFontSmoothing.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitHighlight.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitHyphenateCharacter.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitJustifyContent.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitLineBreak.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitLineClamp.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitLocale.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitLogicalHeight.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitLogicalWidth.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMarginAfter.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMarginAfterCollapse.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMarginBefore.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMarginBeforeCollapse.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMarginBottomCollapse.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMarginEnd.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMarginStart.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMarginTopCollapse.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskBoxImageOutset.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskBoxImageRepeat.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskBoxImageSlice.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskBoxImageSource.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskBoxImageWidth.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskClip.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskComposite.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskImage.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitMaskOrigin.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskPositionX.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskPositionY.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskRepeatX.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskRepeatY.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaskSize.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaxLogicalHeight.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMaxLogicalWidth.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMinLogicalHeight.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitMinLogicalWidth.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitOpacity.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitOrder.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitOriginX.h",
@@ -935,8 +837,6 @@
     "$blink_core_output_dir/css/properties/longhands/WebkitPaddingStart.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitPerspective.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitPerspectiveOrigin.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitPerspectiveOriginX.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitPerspectiveOriginY.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitPrintColorAdjust.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitRtlOrdering.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitRubyPosition.h",
@@ -957,28 +857,21 @@
     "$blink_core_output_dir/css/properties/longhands/WebkitTextStrokeWidth.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransform.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransformOrigin.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitTransformOriginX.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitTransformOriginY.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransformOriginZ.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransformStyle.h",
+    "$blink_core_output_dir/css/properties/longhands/WebkitTransitionTimingFunction.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransitionDelay.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransitionDuration.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitTransitionProperty.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitTransitionTimingFunction.h",
-    "$blink_core_output_dir/css/properties/longhands/WebkitUserDrag.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitUserModify.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitUserSelect.h",
     "$blink_core_output_dir/css/properties/longhands/WebkitWritingMode.h",
     "$blink_core_output_dir/css/properties/longhands/WhiteSpace.h",
-    "$blink_core_output_dir/css/properties/longhands/Widows.h",
-    "$blink_core_output_dir/css/properties/longhands/Width.h",
+    "$blink_core_output_dir/css/properties/longhands/WidthOrHeight.h",
     "$blink_core_output_dir/css/properties/longhands/WillChange.h",
     "$blink_core_output_dir/css/properties/longhands/WordBreak.h",
-    "$blink_core_output_dir/css/properties/longhands/WordSpacing.h",
     "$blink_core_output_dir/css/properties/longhands/WordWrap.h",
     "$blink_core_output_dir/css/properties/longhands/WritingMode.h",
-    "$blink_core_output_dir/css/properties/longhands/X.h",
-    "$blink_core_output_dir/css/properties/longhands/Y.h",
     "$blink_core_output_dir/css/properties/longhands/ZIndex.h",
     "$blink_core_output_dir/css/properties/longhands/Zoom.h",
   ]
@@ -1056,7 +949,6 @@
     "$blink_core_output_dir/css/properties/shorthands/WebkitFlex.h",
     "$blink_core_output_dir/css/properties/shorthands/WebkitFlexFlow.h",
     "$blink_core_output_dir/css/properties/shorthands/WebkitMarginCollapse.h",
-    "$blink_core_output_dir/css/properties/shorthands/WebkitMask.h",
     "$blink_core_output_dir/css/properties/shorthands/WebkitMaskBoxImage.h",
     "$blink_core_output_dir/css/properties/shorthands/WebkitMaskPosition.h",
     "$blink_core_output_dir/css/properties/shorthands/WebkitMaskRepeat.h",
diff --git a/third_party/WebKit/Source/core/animation/PropertyHandle.h b/third_party/WebKit/Source/core/animation/PropertyHandle.h
index 57c8122..2070663a 100644
--- a/third_party/WebKit/Source/core/animation/PropertyHandle.h
+++ b/third_party/WebKit/Source/core/animation/PropertyHandle.h
@@ -23,7 +23,8 @@
       : handle_type_(is_presentation_attribute ? kHandlePresentationAttribute
                                                : kHandleCSSProperty),
         css_property_(&property) {
-    DCHECK_NE(CSSPropertyVariable, property.PropertyID());
+    DCHECK(!property.IDEquals(CSSPropertyInvalid));
+    DCHECK(!property.IDEquals(CSSPropertyVariable));
   }
 
   explicit PropertyHandle(const AtomicString& property_name)
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index 31db26c..b46a354f 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -430,47 +430,34 @@
     "properties/Longhand.h",
     "properties/Shorthand.h",
     "properties/StyleBuildingUtils.h",
-    "properties/longhands/AlignContent.cpp",
     "properties/longhands/AlignItems.cpp",
+    "properties/longhands/AlignOrJustifyContent.cpp",
     "properties/longhands/AlignSelf.cpp",
-    "properties/longhands/AnimationDelay.cpp",
     "properties/longhands/AnimationDirection.cpp",
-    "properties/longhands/AnimationDuration.cpp",
     "properties/longhands/AnimationFillMode.cpp",
     "properties/longhands/AnimationIterationCount.cpp",
     "properties/longhands/AnimationName.cpp",
     "properties/longhands/AnimationPlayState.cpp",
-    "properties/longhands/AnimationTimingFunction.cpp",
+    "properties/longhands/AutoOrString.cpp",
     "properties/longhands/BackdropFilter.cpp",
     "properties/longhands/BackgroundAttachment.cpp",
     "properties/longhands/BackgroundBlendMode.cpp",
-    "properties/longhands/BackgroundClip.cpp",
+    "properties/longhands/BackgroundBox.cpp",
     "properties/longhands/BackgroundColor.cpp",
-    "properties/longhands/BackgroundImage.cpp",
-    "properties/longhands/BackgroundOrigin.cpp",
-    "properties/longhands/BackgroundPositionX.cpp",
-    "properties/longhands/BackgroundPositionY.cpp",
-    "properties/longhands/BackgroundSize.cpp",
+    "properties/longhands/BackgroundOrMaskImage.cpp",
+    "properties/longhands/BackgroundOrMaskSize.cpp",
     "properties/longhands/BaselineShift.cpp",
-    "properties/longhands/BlockSize.cpp",
+    "properties/longhands/BlockSizeOrLogicalHeight.cpp",
     "properties/longhands/BorderBottomColor.cpp",
-    "properties/longhands/BorderBottomLeftRadius.cpp",
-    "properties/longhands/BorderBottomRightRadius.cpp",
-    "properties/longhands/BorderBottomWidth.cpp",
     "properties/longhands/BorderImageOutset.cpp",
     "properties/longhands/BorderImageRepeat.cpp",
     "properties/longhands/BorderImageSlice.cpp",
-    "properties/longhands/BorderImageSource.cpp",
     "properties/longhands/BorderImageWidth.cpp",
     "properties/longhands/BorderLeftColor.cpp",
-    "properties/longhands/BorderLeftWidth.cpp",
+    "properties/longhands/BorderRadiusCorner.cpp",
     "properties/longhands/BorderRightColor.cpp",
-    "properties/longhands/BorderRightWidth.cpp",
     "properties/longhands/BorderTopColor.cpp",
-    "properties/longhands/BorderTopLeftRadius.cpp",
-    "properties/longhands/BorderTopRightRadius.cpp",
-    "properties/longhands/BorderTopWidth.cpp",
-    "properties/longhands/Bottom.cpp",
+    "properties/longhands/BorderWidthSide.cpp",
     "properties/longhands/BoxShadow.cpp",
     "properties/longhands/CaretColor.cpp",
     "properties/longhands/Clip.cpp",
@@ -487,17 +474,15 @@
     "properties/longhands/CounterIncrement.cpp",
     "properties/longhands/CounterReset.cpp",
     "properties/longhands/Cursor.cpp",
-    "properties/longhands/Cx.cpp",
-    "properties/longhands/Cy.cpp",
     "properties/longhands/D.cpp",
-    "properties/longhands/Fill.cpp",
-    "properties/longhands/FillOpacity.cpp",
+    "properties/longhands/Delay.cpp",
+    "properties/longhands/Duration.cpp",
+    "properties/longhands/FillOrStrokeOpacity.cpp",
     "properties/longhands/Filter.cpp",
     "properties/longhands/FlexBasis.cpp",
-    "properties/longhands/FlexGrow.cpp",
-    "properties/longhands/FlexShrink.cpp",
+    "properties/longhands/FlexGrowOrShrink.cpp",
     "properties/longhands/FloodColor.cpp",
-    "properties/longhands/FloodOpacity.cpp",
+    "properties/longhands/FloodOrStopOpacity.cpp",
     "properties/longhands/FontFamily.cpp",
     "properties/longhands/FontFeatureSettings.cpp",
     "properties/longhands/FontSize.cpp",
@@ -510,26 +495,18 @@
     "properties/longhands/FontVariantNumeric.cpp",
     "properties/longhands/FontVariationSettings.cpp",
     "properties/longhands/FontWeight.cpp",
-    "properties/longhands/GridAutoColumns.cpp",
     "properties/longhands/GridAutoFlow.cpp",
-    "properties/longhands/GridAutoRows.cpp",
-    "properties/longhands/GridColumnEnd.cpp",
-    "properties/longhands/GridColumnGap.cpp",
-    "properties/longhands/GridColumnStart.cpp",
-    "properties/longhands/GridRowEnd.cpp",
-    "properties/longhands/GridRowGap.cpp",
-    "properties/longhands/GridRowStart.cpp",
+    "properties/longhands/GridAutoLine.cpp",
+    "properties/longhands/GridLine.cpp",
+    "properties/longhands/GridRowOrColumnGap.cpp",
     "properties/longhands/GridTemplateAreas.cpp",
-    "properties/longhands/GridTemplateColumns.cpp",
-    "properties/longhands/GridTemplateRows.cpp",
-    "properties/longhands/Height.cpp",
+    "properties/longhands/GridTemplateLine.cpp",
     "properties/longhands/ImageOrientation.cpp",
-    "properties/longhands/InlineSize.cpp",
-    "properties/longhands/JustifyContent.cpp",
+    "properties/longhands/ImageSource.cpp",
+    "properties/longhands/InlineSizeOrLogicalWidth.cpp",
     "properties/longhands/JustifyItems.cpp",
     "properties/longhands/JustifySelf.cpp",
-    "properties/longhands/Left.cpp",
-    "properties/longhands/LetterSpacing.cpp",
+    "properties/longhands/LetterAndWordSpacing.cpp",
     "properties/longhands/LightingColor.cpp",
     "properties/longhands/LineHeight.cpp",
     "properties/longhands/LineHeightStep.cpp",
@@ -538,28 +515,25 @@
     "properties/longhands/MarginLeft.cpp",
     "properties/longhands/MarginRight.cpp",
     "properties/longhands/MarginTop.cpp",
-    "properties/longhands/MarkerEnd.cpp",
-    "properties/longhands/MarkerMid.cpp",
-    "properties/longhands/MarkerStart.cpp",
+    "properties/longhands/MarkerPoint.cpp",
     "properties/longhands/Mask.cpp",
     "properties/longhands/MaskSourceType.cpp",
-    "properties/longhands/MaxBlockSize.cpp",
-    "properties/longhands/MaxHeight.cpp",
-    "properties/longhands/MaxInlineSize.cpp",
-    "properties/longhands/MaxWidth.cpp",
-    "properties/longhands/MinBlockSize.cpp",
-    "properties/longhands/MinHeight.cpp",
-    "properties/longhands/MinInlineSize.cpp",
-    "properties/longhands/MinWidth.cpp",
+    "properties/longhands/MaxBlockSizeOrMaxLogicalHeight.cpp",
+    "properties/longhands/MaxInlineSizeOrMaxLogicalWidth.cpp",
+    "properties/longhands/MaxWidthOrHeight.cpp",
+    "properties/longhands/MinBlockSizeOrMinLogicalHeight.cpp",
+    "properties/longhands/MinInlineSizeOrMinLogicalWidth.cpp",
+    "properties/longhands/MinWidthOrHeight.cpp",
     "properties/longhands/ObjectPosition.cpp",
     "properties/longhands/OffsetAnchor.cpp",
     "properties/longhands/OffsetDistance.cpp",
     "properties/longhands/OffsetPath.cpp",
     "properties/longhands/OffsetPosition.cpp",
     "properties/longhands/OffsetRotate.cpp",
+    "properties/longhands/OffsetSide.cpp",
     "properties/longhands/Opacity.cpp",
     "properties/longhands/Order.cpp",
-    "properties/longhands/Orphans.cpp",
+    "properties/longhands/OrphansOrWidows.cpp",
     "properties/longhands/OutlineColor.cpp",
     "properties/longhands/OutlineOffset.cpp",
     "properties/longhands/OutlineWidth.cpp",
@@ -569,45 +543,36 @@
     "properties/longhands/PaddingTop.cpp",
     "properties/longhands/Page.cpp",
     "properties/longhands/PaintOrder.cpp",
+    "properties/longhands/PaintStroke.cpp",
     "properties/longhands/Perspective.cpp",
     "properties/longhands/PerspectiveOrigin.cpp",
+    "properties/longhands/PositionX.cpp",
+    "properties/longhands/PositionY.cpp",
     "properties/longhands/Quotes.cpp",
-    "properties/longhands/R.cpp",
-    "properties/longhands/Right.cpp",
+    "properties/longhands/Radius.cpp",
     "properties/longhands/Rotate.cpp",
-    "properties/longhands/Rx.cpp",
-    "properties/longhands/Ry.cpp",
     "properties/longhands/Scale.cpp",
     "properties/longhands/ScrollPaddingBlockEnd.cpp",
     "properties/longhands/ScrollPaddingBlockStart.cpp",
-    "properties/longhands/ScrollPaddingBottom.cpp",
     "properties/longhands/ScrollPaddingInlineEnd.cpp",
     "properties/longhands/ScrollPaddingInlineStart.cpp",
-    "properties/longhands/ScrollPaddingLeft.cpp",
-    "properties/longhands/ScrollPaddingRight.cpp",
-    "properties/longhands/ScrollPaddingTop.cpp",
+    "properties/longhands/ScrollPaddingSide.cpp",
     "properties/longhands/ScrollSnapAlign.cpp",
     "properties/longhands/ScrollSnapMarginBlockEnd.cpp",
     "properties/longhands/ScrollSnapMarginBlockStart.cpp",
-    "properties/longhands/ScrollSnapMarginBottom.cpp",
     "properties/longhands/ScrollSnapMarginInlineEnd.cpp",
     "properties/longhands/ScrollSnapMarginInlineStart.cpp",
-    "properties/longhands/ScrollSnapMarginLeft.cpp",
-    "properties/longhands/ScrollSnapMarginRight.cpp",
-    "properties/longhands/ScrollSnapMarginTop.cpp",
+    "properties/longhands/ScrollSnapMarginSide.cpp",
     "properties/longhands/ScrollSnapType.cpp",
     "properties/longhands/ShapeImageThreshold.cpp",
+    "properties/longhands/ShapeLength.cpp",
     "properties/longhands/ShapeMargin.cpp",
     "properties/longhands/ShapeOutside.cpp",
     "properties/longhands/Size.cpp",
     "properties/longhands/StopColor.cpp",
-    "properties/longhands/StopOpacity.cpp",
-    "properties/longhands/Stroke.cpp",
     "properties/longhands/StrokeDasharray.cpp",
-    "properties/longhands/StrokeDashoffset.cpp",
+    "properties/longhands/StrokeDashoffsetOrStrokeWidth.cpp",
     "properties/longhands/StrokeMiterlimit.cpp",
-    "properties/longhands/StrokeOpacity.cpp",
-    "properties/longhands/StrokeWidth.cpp",
     "properties/longhands/TabSize.cpp",
     "properties/longhands/TextDecorationColor.cpp",
     "properties/longhands/TextDecorationLine.cpp",
@@ -615,14 +580,11 @@
     "properties/longhands/TextShadow.cpp",
     "properties/longhands/TextSizeAdjust.cpp",
     "properties/longhands/TextUnderlinePosition.cpp",
-    "properties/longhands/Top.cpp",
+    "properties/longhands/TimingFunction.cpp",
     "properties/longhands/TouchAction.cpp",
     "properties/longhands/Transform.cpp",
     "properties/longhands/TransformOrigin.cpp",
-    "properties/longhands/TransitionDelay.cpp",
-    "properties/longhands/TransitionDuration.cpp",
     "properties/longhands/TransitionProperty.cpp",
-    "properties/longhands/TransitionTimingFunction.cpp",
     "properties/longhands/Translate.cpp",
     "properties/longhands/Variable.h",
     "properties/longhands/VerticalAlign.cpp",
@@ -632,22 +594,17 @@
     "properties/longhands/WebkitBorderBeforeWidth.cpp",
     "properties/longhands/WebkitBorderEndColor.cpp",
     "properties/longhands/WebkitBorderEndWidth.cpp",
-    "properties/longhands/WebkitBorderHorizontalSpacing.cpp",
     "properties/longhands/WebkitBorderImage.cpp",
+    "properties/longhands/WebkitBorderSpacing.cpp",
     "properties/longhands/WebkitBorderStartColor.cpp",
     "properties/longhands/WebkitBorderStartWidth.cpp",
-    "properties/longhands/WebkitBorderVerticalSpacing.cpp",
     "properties/longhands/WebkitBoxFlex.cpp",
     "properties/longhands/WebkitBoxFlexGroup.cpp",
     "properties/longhands/WebkitBoxOrdinalGroup.cpp",
     "properties/longhands/WebkitBoxReflect.cpp",
     "properties/longhands/WebkitFontSizeDelta.cpp",
     "properties/longhands/WebkitHighlight.cpp",
-    "properties/longhands/WebkitHyphenateCharacter.cpp",
     "properties/longhands/WebkitLineClamp.cpp",
-    "properties/longhands/WebkitLocale.cpp",
-    "properties/longhands/WebkitLogicalHeight.cpp",
-    "properties/longhands/WebkitLogicalWidth.cpp",
     "properties/longhands/WebkitMarginAfter.cpp",
     "properties/longhands/WebkitMarginBefore.cpp",
     "properties/longhands/WebkitMarginEnd.cpp",
@@ -655,25 +612,16 @@
     "properties/longhands/WebkitMaskBoxImageOutset.cpp",
     "properties/longhands/WebkitMaskBoxImageRepeat.cpp",
     "properties/longhands/WebkitMaskBoxImageSlice.cpp",
-    "properties/longhands/WebkitMaskBoxImageSource.cpp",
     "properties/longhands/WebkitMaskBoxImageWidth.cpp",
     "properties/longhands/WebkitMaskClip.cpp",
     "properties/longhands/WebkitMaskComposite.cpp",
-    "properties/longhands/WebkitMaskImage.cpp",
     "properties/longhands/WebkitMaskOrigin.cpp",
-    "properties/longhands/WebkitMaskPositionX.cpp",
-    "properties/longhands/WebkitMaskPositionY.cpp",
-    "properties/longhands/WebkitMaskSize.cpp",
-    "properties/longhands/WebkitMaxLogicalHeight.cpp",
-    "properties/longhands/WebkitMaxLogicalWidth.cpp",
-    "properties/longhands/WebkitMinLogicalHeight.cpp",
-    "properties/longhands/WebkitMinLogicalWidth.cpp",
+    "properties/longhands/WebkitOriginX.cpp",
+    "properties/longhands/WebkitOriginY.cpp",
     "properties/longhands/WebkitPaddingAfter.cpp",
     "properties/longhands/WebkitPaddingBefore.cpp",
     "properties/longhands/WebkitPaddingEnd.cpp",
     "properties/longhands/WebkitPaddingStart.cpp",
-    "properties/longhands/WebkitPerspectiveOriginX.cpp",
-    "properties/longhands/WebkitPerspectiveOriginY.cpp",
     "properties/longhands/WebkitTapHighlightColor.cpp",
     "properties/longhands/WebkitTextDecorationsInEffect.cpp",
     "properties/longhands/WebkitTextEmphasisColor.cpp",
@@ -682,15 +630,9 @@
     "properties/longhands/WebkitTextFillColor.cpp",
     "properties/longhands/WebkitTextStrokeColor.cpp",
     "properties/longhands/WebkitTextStrokeWidth.cpp",
-    "properties/longhands/WebkitTransformOriginX.cpp",
-    "properties/longhands/WebkitTransformOriginY.cpp",
     "properties/longhands/WebkitTransformOriginZ.cpp",
-    "properties/longhands/Widows.cpp",
-    "properties/longhands/Width.cpp",
+    "properties/longhands/WidthOrHeight.cpp",
     "properties/longhands/WillChange.cpp",
-    "properties/longhands/WordSpacing.cpp",
-    "properties/longhands/X.cpp",
-    "properties/longhands/Y.cpp",
     "properties/longhands/ZIndex.cpp",
     "properties/longhands/Zoom.cpp",
     "properties/shorthands/Animation.cpp",
@@ -750,7 +692,6 @@
     "properties/shorthands/WebkitColumnBreakBefore.cpp",
     "properties/shorthands/WebkitColumnBreakInside.cpp",
     "properties/shorthands/WebkitMarginCollapse.cpp",
-    "properties/shorthands/WebkitMask.cpp",
     "properties/shorthands/WebkitMaskBoxImage.cpp",
     "properties/shorthands/WebkitMaskPosition.cpp",
     "properties/shorthands/WebkitMaskRepeat.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index b24998c..76950d3b 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -20,6 +20,19 @@
     longhands: {
     },
 
+    // - property_class: true|"classname"
+    // Specifies the existence (and optionally name) of a CSSProperty for
+    // this property.
+    // * Add this flag if a property class has been implemented for this property.
+    // * If the classname for this is different to the name of the property,
+    //   specify a value for this flag.
+    //   e.g. property_class=CSSPropertyWebkitPadding.
+    // TODO(meade): When most properties have been implemented, modify this so
+    // that properties with default classnames do not get this flag, and
+    // introduce a 'not_implemented' flag instead.
+    property_class: {
+    },
+
     // - property_methods: ["method1", "method2"]
     // List of methods that are implemented in the CSSProperty for this
     // property.
@@ -343,12 +356,14 @@
     // Animation Priority properties
     {
       name: "animation-delay",
+      property_class: "Delay",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "animation-direction",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       keywords: ["normal", "reverse", "alternate", "alternate-reverse"],
       separator: ",",
@@ -357,6 +372,7 @@
     },
     {
       name: "animation-duration",
+      property_class: "Duration",
       property_methods: ["ParseSingleValue"],
       typedom_types: ["Time"],
       separator: ",",
@@ -365,12 +381,14 @@
     },
     {
       name: "animation-fill-mode",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "animation-iteration-count",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       keywords: ["infinite"],
       separator: ",",
@@ -379,30 +397,35 @@
     },
     {
       name: "animation-name",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "animation-play-state",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "animation-timing-function",
+      property_class: "TimingFunction",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "transition-delay",
+      property_class: "Delay",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "transition-duration",
+      property_class: "Duration",
       property_methods: ["ParseSingleValue"],
       typedom_types: ["Time"],
       separator: ",",
@@ -411,12 +434,14 @@
     },
     {
       name: "transition-property",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
     },
     {
       name: "transition-timing-function",
+      property_class: "TimingFunction",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
       priority: "Animation",
@@ -427,6 +452,7 @@
     // (e.g. font-size / ems)
     {
       name: "color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       inherited: true,
@@ -441,6 +467,7 @@
     },
     {
       name: "direction",
+      property_class: true,
       affected_by_all: false,
       inherited: true,
       field_template: "keyword",
@@ -453,6 +480,7 @@
     },
     {
       name: "font-family",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       inherited: true,
@@ -464,6 +492,7 @@
     },
     {
       name: "font-kerning",
+      property_class: true,
       inherited: true,
       font: true,
       name_for_methods: "Kerning",
@@ -472,6 +501,7 @@
     },
     {
       name: "font-size",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -483,6 +513,7 @@
     },
     {
       name: "font-size-adjust",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -494,6 +525,7 @@
     },
     {
       name: "font-stretch",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       inherited: true,
@@ -504,6 +536,7 @@
     },
     {
       name: "font-style",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       inherited: true,
@@ -514,6 +547,7 @@
     },
     {
       name: "font-variant-ligatures",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       font: true,
@@ -524,6 +558,7 @@
     },
     {
       name: "font-variant-caps",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       font: true,
@@ -533,6 +568,7 @@
     },
     {
       name: "font-variant-east-asian",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       font: true,
@@ -542,6 +578,7 @@
     },
     {
       name: "font-variant-numeric",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       font: true,
@@ -551,6 +588,7 @@
     },
     {
       name: "font-weight",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       interpolable: true,
@@ -562,6 +600,7 @@
     },
     {
       name: "font-feature-settings",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       inherited: true,
@@ -572,6 +611,7 @@
     },
     {
       name: "font-variation-settings",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -583,6 +623,7 @@
     },
     {
       name: "-webkit-font-smoothing",
+      property_class: true,
       inherited: true,
       font: true,
       type_name: "FontSmoothingMode",
@@ -590,6 +631,7 @@
     },
     {
       name: "-webkit-locale",
+      property_class: "AutoOrString",
       property_methods: ["ParseSingleValue"],
       inherited: true,
       font: true,
@@ -598,6 +640,7 @@
     },
     {
       name: "text-orientation",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -609,6 +652,7 @@
     },
     {
       name: "-webkit-text-orientation",
+      property_class: true,
       inherited: true,
       type_name: "TextOrientation",
       custom_apply_functions_value: true,
@@ -616,6 +660,7 @@
     },
     {
       name: "writing-mode",
+      property_class: true,
       inherited: true,
       field_template: "keyword",
       include_paths: ["platform/text/WritingMode.h"],
@@ -627,6 +672,7 @@
     },
     {
       name: "-webkit-writing-mode",
+      property_class: true,
       inherited: true,
       type_name: "WritingMode",
       custom_apply_functions_value: true,
@@ -634,6 +680,7 @@
     },
     {
       name: "text-rendering",
+      property_class: true,
       inherited: true,
       font: true,
       type_name: "TextRenderingMode",
@@ -641,6 +688,7 @@
     },
     {
       name: "zoom",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       field_group: "visual",
@@ -653,6 +701,7 @@
     },
     {
       name: "align-content",
+      property_class: "AlignOrJustifyContent",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -663,6 +712,7 @@
     },
     {
       name: "align-items",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -677,6 +727,7 @@
     },
     {
       name: "align-self",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -687,6 +738,7 @@
     },
     {
       name: "backdrop-filter",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       compositable: true,
@@ -702,6 +754,7 @@
     },
     {
       name: "backface-visibility",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: ["visible", "hidden"],
@@ -709,21 +762,25 @@
     },
     {
       name: "background-attachment",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "background-blend-mode",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "background-clip",
+      property_class: "BackgroundBox",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "background-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "background",
@@ -736,6 +793,7 @@
     },
     {
       name: "background-image",
+      property_class: "BackgroundOrMaskImage",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       keywords: ["auto", "none"],
@@ -744,17 +802,20 @@
     },
     {
       name: "background-origin",
+      property_class: "BackgroundBox",
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "background-position-x",
+      property_class: "PositionX",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "background-position-y",
+      property_class: "PositionY",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
@@ -769,12 +830,14 @@
     },
     {
       name: "background-size",
+      property_class: "BackgroundOrMaskSize",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "baseline-shift",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -783,6 +846,7 @@
     },
     {
       name: "border-bottom-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "surround",
@@ -795,6 +859,7 @@
     },
     {
       name: "border-bottom-left-radius",
+      property_class: "BorderRadiusCorner",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -806,6 +871,7 @@
     },
     {
       name: "border-bottom-right-radius",
+      property_class: "BorderRadiusCorner",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -829,6 +895,7 @@
     },
     {
       name: "border-bottom-width",
+      property_class: "BorderWidthSide",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -843,6 +910,7 @@
     },
     {
       name: "border-collapse",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -851,23 +919,27 @@
     },
     {
       name: "border-image-outset",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "border-image-repeat",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "border-image-slice",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "border-image-source",
+      property_class: "ImageSource",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       keywords: ["none"],
@@ -876,12 +948,14 @@
     },
     {
       name: "border-image-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "border-left-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "surround",
@@ -906,6 +980,7 @@
     },
     {
       name: "border-left-width",
+      property_class: "BorderWidthSide",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -920,6 +995,7 @@
     },
     {
       name: "border-right-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "surround",
@@ -944,6 +1020,7 @@
     },
     {
       name: "border-right-width",
+      property_class: "BorderWidthSide",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -958,6 +1035,7 @@
     },
     {
       name: "border-top-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "surround",
@@ -970,6 +1048,7 @@
     },
     {
       name: "border-top-left-radius",
+      property_class: "BorderRadiusCorner",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -981,6 +1060,7 @@
     },
     {
       name: "border-top-right-radius",
+      property_class: "BorderRadiusCorner",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -1004,6 +1084,7 @@
     },
     {
       name: "border-top-width",
+      property_class: "BorderWidthSide",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "surround",
@@ -1018,6 +1099,7 @@
     },
     {
       name: "bottom",
+      property_class: "OffsetSide",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1029,6 +1111,7 @@
     },
     {
       name: "box-shadow",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1041,6 +1124,7 @@
     },
     {
       name: "box-sizing",
+      property_class: true,
       field_group: "box",
       field_template: "keyword",
       keywords: ["content-box", "border-box"],
@@ -1084,6 +1168,7 @@
     },
     {
       name: "caption-side",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -1092,6 +1177,7 @@
     },
     {
       name: "caret-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       inherited: true,
@@ -1111,6 +1197,7 @@
     },
     {
       name: "clip",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "visual",
@@ -1124,6 +1211,7 @@
     },
     {
       name: "clip-path",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1136,23 +1224,27 @@
     },
     {
       name: "clip-rule",
+      property_class: true,
       inherited: true,
       svg: true,
       type_name: "WindRule",
     },
     {
       name: "color-interpolation",
+      property_class: true,
       inherited: true,
       svg: true,
     },
     {
       name: "color-interpolation-filters",
+      property_class: true,
       inherited: true,
       svg: true,
       type_name: "EColorInterpolation",
     },
     {
       name: "color-rendering",
+      property_class: true,
       inherited: true,
       svg: true,
     },
@@ -1166,6 +1258,7 @@
     },
     {
       name: "contain",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_size: 4,
@@ -1177,6 +1270,7 @@
     },
     {
       name: "content",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1191,16 +1285,19 @@
     },
     {
       name: "counter-increment",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "counter-reset",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "cursor",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_template: "keyword",
@@ -1218,6 +1315,7 @@
     },
     {
       name: "cx",
+      property_class: "ShapeLength",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -1225,6 +1323,7 @@
     },
     {
       name: "cy",
+      property_class: "ShapeLength",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -1232,6 +1331,7 @@
     },
     {
       name: "d",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -1251,11 +1351,13 @@
     },
     {
       name: "dominant-baseline",
+      property_class: true,
       inherited: true,
       svg: true,
     },
     {
       name: "empty-cells",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -1264,6 +1366,7 @@
     },
     {
       name: "fill",
+      property_class: "PaintStroke",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1273,6 +1376,7 @@
     },
     {
       name: "fill-opacity",
+      property_class: "FillOrStrokeOpacity",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1281,12 +1385,14 @@
     },
     {
       name: "fill-rule",
+      property_class: true,
       inherited: true,
       svg: true,
       type_name: "WindRule",
     },
     {
       name: "filter",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       compositable: true,
@@ -1301,6 +1407,7 @@
     },
     {
       name: "flex-basis",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1310,6 +1417,7 @@
     },
     {
       name: "flex-direction",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: ["row", "row-reverse", "column", "column-reverse"],
@@ -1317,6 +1425,7 @@
     },
     {
       name: "flex-grow",
+      property_class: "FlexGrowOrShrink",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1326,6 +1435,7 @@
     },
     {
       name: "flex-shrink",
+      property_class: "FlexGrowOrShrink",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1335,6 +1445,7 @@
     },
     {
       name: "flex-wrap",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: ["nowrap", "wrap", "wrap-reverse"],
@@ -1350,6 +1461,7 @@
     },
     {
       name: "flood-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       svg: true,
@@ -1357,6 +1469,7 @@
     },
     {
       name: "flood-opacity",
+      property_class: "FloodOrStopOpacity",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -1364,6 +1477,7 @@
     },
     {
       name: "grid-auto-columns",
+      property_class: "GridAutoLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1374,6 +1488,7 @@
     },
     {
       name: "grid-auto-flow",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_size: 4, // FIXME: Make this use "kGridAutoFlowBits".
@@ -1385,6 +1500,7 @@
     },
     {
       name: "grid-auto-rows",
+      property_class: "GridAutoLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1395,6 +1511,7 @@
     },
     {
       name: "grid-column-end",
+      property_class: "GridLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1405,6 +1522,7 @@
     },
     {
       name: "grid-column-gap",
+      property_class: "GridRowOrColumnGap",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "<length>",
@@ -1413,6 +1531,7 @@
     },
     {
       name: "grid-column-start",
+      property_class: "GridLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1423,6 +1542,7 @@
     },
     {
       name: "grid-row-end",
+      property_class: "GridLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1433,6 +1553,7 @@
     },
     {
       name: "grid-row-gap",
+      property_class: "GridRowOrColumnGap",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "<length>",
@@ -1441,6 +1562,7 @@
     },
     {
       name: "grid-row-start",
+      property_class: "GridLine",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1451,11 +1573,13 @@
     },
     {
       name: "grid-template-areas",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "grid-template-columns",
+      property_class: "GridTemplateLine",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       field_group: "*",
       field_template: "external",
@@ -1466,6 +1590,7 @@
     },
     {
       name: "grid-template-rows",
+      property_class: "GridTemplateLine",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       field_group: "*",
       field_template: "external",
@@ -1476,6 +1601,7 @@
     },
     {
       name: "height",
+      property_class: "WidthOrHeight",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       is_descriptor: true,
       interpolable: true,
@@ -1488,6 +1614,7 @@
     },
     {
       name: "hyphens",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -1497,6 +1624,7 @@
     },
     {
       name: "image-rendering",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -1508,6 +1636,7 @@
     },
     {
       name: "image-orientation",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       runtime_flag: "ImageOrientation",
@@ -1527,6 +1656,7 @@
     },
     {
       name: "justify-content",
+      property_class: "AlignOrJustifyContent",
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1537,6 +1667,7 @@
     },
     {
       name: "justify-items",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1547,6 +1678,7 @@
     },
     {
       name: "justify-self",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -1557,6 +1689,7 @@
     },
     {
       name: "left",
+      property_class: "OffsetSide",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1568,6 +1701,7 @@
     },
     {
       name: "letter-spacing",
+      property_class: "LetterAndWordSpacing",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1575,6 +1709,7 @@
     },
     {
       name: "lighting-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       svg: true,
@@ -1582,6 +1717,7 @@
     },
     {
       name: "line-height",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1594,6 +1730,7 @@
     },
     {
       name: "line-height-step",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       runtime_flag: "CSSSnapSize",
@@ -1605,6 +1742,7 @@
     },
     {
       name: "list-style-image",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1620,6 +1758,7 @@
     },
     {
       name: "list-style-position",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -1628,6 +1767,7 @@
     },
     {
       name: "list-style-type",
+      property_class: true,
       inherited: true,
       field_template: "keyword",
       keywords: [
@@ -1649,6 +1789,7 @@
     },
     {
       name: "margin-bottom",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1658,6 +1799,7 @@
     },
     {
       name: "margin-left",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1667,6 +1809,7 @@
     },
     {
       name: "margin-right",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1676,6 +1819,7 @@
     },
     {
       name: "margin-top",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1685,6 +1829,7 @@
     },
     {
       name: "marker-end",
+      property_class: "MarkerPoint",
       property_methods: ["ParseSingleValue"],
       inherited: true,
       svg: true,
@@ -1693,6 +1838,7 @@
     },
     {
       name: "marker-mid",
+      property_class: "MarkerPoint",
       property_methods: ["ParseSingleValue"],
       inherited: true,
       svg: true,
@@ -1701,6 +1847,7 @@
     },
     {
       name: "marker-start",
+      property_class: "MarkerPoint",
       property_methods: ["ParseSingleValue"],
       inherited: true,
       svg: true,
@@ -1709,6 +1856,7 @@
     },
     {
       name: "mask",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       svg: true,
       name_for_methods: "MaskerResource",
@@ -1716,6 +1864,7 @@
     },
     {
       name: "mask-source-type",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSMaskSourceType",
       custom_apply_functions_all: true,
@@ -1726,6 +1875,7 @@
     },
     {
       name: "max-height",
+      property_class: "MaxWidthOrHeight",
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       interpolable: true,
@@ -1736,6 +1886,7 @@
     },
     {
       name: "max-width",
+      property_class: "MaxWidthOrHeight",
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       interpolable: true,
@@ -1746,6 +1897,7 @@
     },
     {
       name: "min-height",
+      property_class: "MinWidthOrHeight",
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       interpolable: true,
@@ -1756,6 +1908,7 @@
     },
     {
       name: "min-width",
+      property_class: "MinWidthOrHeight",
       property_methods: ["ParseSingleValue"],
       is_descriptor: true,
       interpolable: true,
@@ -1788,6 +1941,7 @@
     },
     {
       name: "object-position",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1799,6 +1953,7 @@
     },
     {
       name: "offset-anchor",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       runtime_flag: "CSSOffsetPositionAnchor",
@@ -1811,6 +1966,7 @@
     },
     {
       name: "offset-distance",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1820,6 +1976,7 @@
     },
     {
       name: "offset-path",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1832,6 +1989,7 @@
     },
     {
       name: "offset-position",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       runtime_flag: "CSSOffsetPositionAnchor",
@@ -1844,6 +2002,7 @@
     },
     {
       name: "offset-rotate",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1855,6 +2014,7 @@
     },
     {
       name: "opacity",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       compositable: true,
@@ -1866,6 +2026,7 @@
     },
     {
       name: "order",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1876,6 +2037,7 @@
     },
     {
       name: "orphans",
+      property_class: "OrphansOrWidows",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -1886,6 +2048,7 @@
     },
     {
       name: "outline-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "*",
@@ -1898,6 +2061,7 @@
     },
     {
       name: "outline-offset",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1921,6 +2085,7 @@
     },
     {
       name: "outline-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -1933,6 +2098,7 @@
     },
     {
       name: "overflow-anchor",
+      property_class: true,
       inherited: false,
       runtime_flag: "ScrollAnchoring",
       field_template: "keyword",
@@ -1943,6 +2109,7 @@
     },
     {
       name: "overflow-wrap",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -1971,6 +2138,7 @@
     },
     {
       name: "padding-bottom",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1980,6 +2148,7 @@
     },
     {
       name: "padding-left",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1989,6 +2158,7 @@
     },
     {
       name: "padding-right",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -1998,6 +2168,7 @@
     },
     {
       name: "padding-top",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -2007,6 +2178,7 @@
     },
     {
       name: "paint-order",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       svg: true,
@@ -2014,6 +2186,7 @@
     },
     {
       name: "perspective",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2024,6 +2197,7 @@
     },
     {
       name: "perspective-origin",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "*",
@@ -2035,6 +2209,7 @@
     },
     {
       name: "pointer-events",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -2056,6 +2231,7 @@
     },
     {
       name: "quotes",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -2076,6 +2252,7 @@
     },
     {
       name: "right",
+      property_class: "OffsetSide",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -2087,6 +2264,7 @@
     },
     {
       name: "r",
+      property_class: "ShapeLength",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2094,6 +2272,7 @@
     },
     {
       name: "rx",
+      property_class: "Radius",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2101,6 +2280,7 @@
     },
     {
       name: "ry",
+      property_class: "Radius",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2108,6 +2288,7 @@
     },
     {
       name: "scroll-behavior",
+      property_class: true,
       runtime_flag: "CSSOMSmoothScroll",
       field_group: "*",
       field_size: 2, // FIXME: Convert this to a keyword field
@@ -2117,6 +2298,7 @@
     },
     {
       name: "overscroll-behavior-x",
+      property_class: "OverscrollBehaviorXOrY",
       runtime_flag: "CSSOverscrollBehavior",
       field_template: "keyword",
       keywords: ["auto", "contain", "none"],
@@ -2125,6 +2307,7 @@
     },
     {
       name: "overscroll-behavior-y",
+      property_class: "OverscrollBehaviorXOrY",
       runtime_flag: "CSSOverscrollBehavior",
       field_template: "keyword",
       keywords: ["auto", "contain", "none"],
@@ -2133,6 +2316,7 @@
     },
     {
       name: "scroll-snap-type",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2145,6 +2329,7 @@
     },
     {
       name: "scroll-snap-align",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2157,6 +2342,7 @@
     },
     {
       name: "scroll-snap-stop",
+      property_class: true,
       runtime_flag: "CSSScrollSnapPoints",
       field_template: "keyword",
       keywords: ["normal", "always"],
@@ -2164,6 +2350,7 @@
     },
     {
       name: "scroll-padding-top",
+      property_class: "ScrollPaddingSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2174,6 +2361,7 @@
     },
     {
       name: "scroll-padding-bottom",
+      property_class: "ScrollPaddingSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2184,6 +2372,7 @@
     },
     {
       name: "scroll-padding-left",
+      property_class: "ScrollPaddingSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2194,6 +2383,7 @@
     },
     {
       name: "scroll-padding-right",
+      property_class: "ScrollPaddingSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2204,6 +2394,7 @@
     },
     {
       name: "scroll-padding-block-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       include_paths: ["platform/Length.h"],
@@ -2217,6 +2408,7 @@
     },
     {
       name: "scroll-padding-block-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       include_paths: ["platform/Length.h"],
@@ -2230,6 +2422,7 @@
     },
     {
       name: "scroll-padding-inline-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       include_paths: ["platform/Length.h"],
@@ -2243,6 +2436,7 @@
     },
     {
       name: "scroll-padding-inline-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       include_paths: ["platform/Length.h"],
@@ -2256,6 +2450,7 @@
     },
     {
       name: "scroll-snap-margin-top",
+      property_class: "ScrollSnapMarginSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2266,6 +2461,7 @@
     },
     {
       name: "scroll-snap-margin-bottom",
+      property_class: "ScrollSnapMarginSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2276,6 +2472,7 @@
     },
     {
       name: "scroll-snap-margin-left",
+      property_class: "ScrollSnapMarginSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2286,6 +2483,7 @@
     },
     {
       name: "scroll-snap-margin-right",
+      property_class: "ScrollSnapMarginSide",
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       field_group: "*",
@@ -2296,6 +2494,7 @@
     },
     {
       name: "scroll-snap-margin-block-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       direction_aware_options: {
@@ -2305,6 +2504,7 @@
     },
     {
       name: "scroll-snap-margin-block-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       direction_aware_options: {
@@ -2314,6 +2514,7 @@
     },
     {
       name: "scroll-snap-margin-inline-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       direction_aware_options: {
@@ -2323,6 +2524,7 @@
     },
     {
       name: "scroll-snap-margin-inline-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       runtime_flag: "CSSScrollSnapPoints",
       direction_aware_options: {
@@ -2332,6 +2534,7 @@
     },
     {
       name: "shape-image-threshold",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2342,6 +2545,7 @@
     },
     {
       name: "shape-margin",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2351,6 +2555,7 @@
     },
     {
       name: "shape-outside",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2365,16 +2570,19 @@
     },
     {
       name: "shape-rendering",
+      property_class: true,
       inherited: true,
       svg: true,
     },
     {
       name: "size",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "speak",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -2386,6 +2594,7 @@
     },
     {
       name: "stop-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       svg: true,
@@ -2393,6 +2602,7 @@
     },
     {
       name: "stop-opacity",
+      property_class: "FloodOrStopOpacity",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2400,6 +2610,7 @@
     },
     {
       name: "stroke",
+      property_class: "PaintStroke",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2409,6 +2620,7 @@
     },
     {
       name: "stroke-dasharray",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2418,6 +2630,7 @@
     },
     {
       name: "stroke-dashoffset",
+      property_class: "StrokeDashoffsetOrStrokeWidth",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2427,6 +2640,7 @@
     },
     {
       name: "stroke-linecap",
+      property_class: true,
       inherited: true,
       svg: true,
       name_for_methods: "CapStyle",
@@ -2434,6 +2648,7 @@
     },
     {
       name: "stroke-linejoin",
+      property_class: true,
       inherited: true,
       svg: true,
       name_for_methods: "JoinStyle",
@@ -2441,6 +2656,7 @@
     },
     {
       name: "stroke-miterlimit",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2450,6 +2666,7 @@
     },
     {
       name: "stroke-opacity",
+      property_class: "FillOrStrokeOpacity",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2458,6 +2675,7 @@
     },
     {
       name: "stroke-width",
+      property_class: "StrokeDashoffsetOrStrokeWidth",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2474,6 +2692,7 @@
     },
     {
       name: "tab-size",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -2486,6 +2705,7 @@
     },
     {
       name: "text-align",
+      property_class: true,
       independent: false,
       inherited: true,
       field_template: "keyword",
@@ -2499,6 +2719,7 @@
     },
     {
       name: "text-align-last",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -2507,11 +2728,13 @@
     },
     {
       name: "text-anchor",
+      property_class: true,
       inherited: true,
       svg: true,
     },
     {
       name: "text-combine-upright",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -2521,6 +2744,7 @@
     },
     {
       name: "text-decoration-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "*",
@@ -2532,6 +2756,7 @@
     },
     {
       name: "text-decoration-line",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "visual",
       field_template: "multi_keyword",
@@ -2543,6 +2768,7 @@
     },
     {
       name: "text-decoration-skip-ink",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -2551,6 +2777,7 @@
     },
     {
       name: "text-decoration-style",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: ["solid", "double", "dotted", "dashed", "wavy"],
@@ -2558,6 +2785,7 @@
     },
     {
       name: "text-indent",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2568,6 +2796,7 @@
     },
     {
       name: "text-justify",
+      property_class: true,
       inherited: true,
       runtime_flag: "CSS3Text",
       field_group: "*",
@@ -2587,6 +2816,7 @@
     },
     {
       name: "text-shadow",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2600,6 +2830,7 @@
     },
     {
       name: "text-size-adjust",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -2612,6 +2843,7 @@
     },
     {
       name: "text-transform",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -2621,6 +2853,7 @@
     // FIXME: Implement support for 'under left' and 'under right' values.
     {
       name: "text-underline-position",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -2631,6 +2864,7 @@
     },
     {
       name: "top",
+      property_class: "OffsetSide",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "surround",
@@ -2642,6 +2876,7 @@
     },
     {
       name: "touch-action",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_size: 6, // FIXME: Make this use "kTouchActionBits".
@@ -2653,6 +2888,7 @@
     },
     {
       name: "transform",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       compositable: true,
@@ -2667,6 +2903,7 @@
     },
     {
       name: "transform-box",
+      property_class: true,
       runtime_flag: "CSSTransformBox",
       field_template: "keyword",
       keywords: ["fill-box", "view-box"],
@@ -2674,6 +2911,7 @@
     },
     {
       name: "transform-origin",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       field_group: "*",
@@ -2686,6 +2924,7 @@
     },
     {
       name: "transform-style",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: ["flat", "preserve-3d"],
@@ -2694,6 +2933,7 @@
     },
     {
       name: "translate",
+      property_class: true,
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       interpolable: true,
       compositable: true,
@@ -2708,6 +2948,7 @@
     },
     {
       name: "rotate",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       compositable: true,
@@ -2722,6 +2963,7 @@
     },
     {
       name: "scale",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       compositable: true,
@@ -2736,6 +2978,7 @@
     },
     {
       name: "unicode-bidi",
+      property_class: true,
       affected_by_all: false,
       field_template: "keyword",
       include_paths: ["platform/text/UnicodeBidi.h"],
@@ -2752,6 +2995,7 @@
     },
     {
       name: "vertical-align",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_inherit: true,
@@ -2759,6 +3003,7 @@
     },
     {
       name: "visibility",
+      property_class: true,
       independent: true,
       interpolable: true,
       inherited: true,
@@ -2768,6 +3013,7 @@
     },
     {
       name: "x",
+      property_class: "ShapeLength",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2775,6 +3021,7 @@
     },
     {
       name: "y",
+      property_class: "ShapeLength",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       svg: true,
@@ -2799,6 +3046,7 @@
     },
     {
       name: "-webkit-border-horizontal-spacing",
+      property_class: "WebkitBorderSpacing",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2811,11 +3059,13 @@
     },
     {
       name: "-webkit-border-image",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_value: true,
     },
     {
       name: "-webkit-border-vertical-spacing",
+      property_class: "WebkitBorderSpacing",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -2845,6 +3095,7 @@
     },
     {
       name: "-webkit-box-direction",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -2853,6 +3104,7 @@
     },
     {
       name: "-webkit-box-flex",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "primitive",
@@ -2861,6 +3113,7 @@
     },
     {
       name: "-webkit-box-flex-group",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "primitive",
@@ -2876,6 +3129,7 @@
     },
     {
       name: "-webkit-box-ordinal-group",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "primitive",
@@ -2899,6 +3153,7 @@
     },
     {
       name: "-webkit-box-reflect",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "pointer",
@@ -2910,6 +3165,7 @@
     },
     {
       name: "column-count",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2921,6 +3177,7 @@
     },
     {
       name: "column-gap",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2933,6 +3190,7 @@
     },
     {
       name: "column-rule-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       field_group: "*",
@@ -2945,6 +3203,7 @@
     },
     {
       name: "column-rule-style",
+      property_class: true,
       field_group: "*",
       field_template: "keyword",
       keywords: [
@@ -2956,6 +3215,7 @@
     },
     {
       name: "column-rule-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2968,6 +3228,7 @@
     },
     {
       name: "column-span",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "keyword",
@@ -2977,6 +3238,7 @@
     },
     {
       name: "column-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "*",
@@ -2989,6 +3251,7 @@
     },
     {
       name: "-webkit-highlight",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -3000,6 +3263,7 @@
     },
     {
       name: "-webkit-hyphenate-character",
+      property_class: "AutoOrString",
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -3012,6 +3276,7 @@
     },
     {
       name: "-webkit-line-break",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3021,12 +3286,14 @@
     },
     {
       name: "line-break",
+      property_class: true,
       inherited: true,
       type_name: "LineBreak",
     },
     // An Apple extension.
     {
       name: "-webkit-line-clamp",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       field_group: "*",
       field_template: "external",
@@ -3062,62 +3329,73 @@
     },
     {
       name: "-webkit-mask-box-image-outset",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-box-image-repeat",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-box-image-slice",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-box-image-source",
+      property_class: "ImageSource",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_value: true,
     },
     {
       name: "-webkit-mask-box-image-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-clip",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-composite",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-image",
+      property_class: "BackgroundOrMaskImage",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-origin",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-position-x",
+      property_class: "PositionX",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-mask-position-y",
+      property_class: "PositionY",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
@@ -3132,24 +3410,28 @@
     },
     {
       name: "-webkit-mask-size",
+      property_class: "BackgroundOrMaskSize",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-perspective-origin-x",
+      property_class: "WebkitOriginX",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       converter: "ConvertLength",
     },
     {
       name: "-webkit-perspective-origin-y",
+      property_class: "WebkitOriginY",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       converter: "ConvertLength",
     },
     {
       name: "-webkit-print-color-adjust",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -3158,6 +3440,7 @@
     },
     {
       name: "-webkit-rtl-ordering",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -3169,6 +3452,7 @@
     },
     {
       name: "-webkit-ruby-position",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3178,6 +3462,7 @@
     },
     {
       name: "-webkit-tap-highlight-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       inherited: true,
       field_group: "*",
@@ -3187,11 +3472,13 @@
     },
     {
       name: "-webkit-text-combine",
+      property_class: true,
       inherited: true,
       name_for_methods: "TextCombine",
     },
     {
       name: "-webkit-text-emphasis-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       inherited: true,
       field_group: "*",
@@ -3204,6 +3491,7 @@
     },
     {
       name: "-webkit-text-emphasis-position",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -3215,12 +3503,14 @@
     },
     {
       name: "-webkit-text-emphasis-style",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       custom_apply_functions_all: true,
     },
     {
       name: "-webkit-text-fill-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       inherited: true,
       field_group: "*",
@@ -3233,6 +3523,7 @@
     },
     {
       name: "-webkit-text-security",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3241,6 +3532,7 @@
     },
     {
       name: "-webkit-text-stroke-color",
+      property_class: true,
       property_methods: ["ParseSingleValue", "CSSValueFromComputedStyle", "ColorIncludingFallback"],
       interpolable: true,
       inherited: true,
@@ -3254,6 +3546,7 @@
     },
     {
       name: "-webkit-text-stroke-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       field_group: "*",
@@ -3264,18 +3557,21 @@
     },
     {
       name: "-webkit-transform-origin-x",
+      property_class: "WebkitOriginX",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       converter: "ConvertLength",
     },
     {
       name: "-webkit-transform-origin-y",
+      property_class: "WebkitOriginY",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       converter: "ConvertLength",
     },
     {
       name: "-webkit-transform-origin-z",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       converter: "ConvertComputedLength<float>",
@@ -3289,6 +3585,7 @@
     },
     {
       name: "-webkit-user-modify",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3297,6 +3594,7 @@
     },
     {
       name: "user-select",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3305,6 +3603,7 @@
     },
     {
       name: "white-space",
+      property_class: true,
       independent: true,
       inherited: true,
       field_template: "keyword",
@@ -3315,6 +3614,7 @@
     },
     {
       name: "widows",
+      property_class: "OrphansOrWidows",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -3325,6 +3625,7 @@
     },
     {
       name: "width",
+      property_class: "WidthOrHeight",
       property_methods: ["ParseSingleValue", "IsLayoutDependent"],
       is_descriptor: true,
       interpolable: true,
@@ -3337,11 +3638,13 @@
     },
     {
       name: "will-change",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       custom_apply_functions_all: true,
     },
     {
       name: "word-break",
+      property_class: true,
       inherited: true,
       field_group: "*",
       field_template: "keyword",
@@ -3351,6 +3654,7 @@
     },
     {
       name: "word-spacing",
+      property_class: "LetterAndWordSpacing",
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       inherited: true,
@@ -3360,11 +3664,13 @@
     // property. So using the same handlers.
     {
       name: "word-wrap",
+      property_class: true,
       inherited: true,
       name_for_methods: "OverflowWrap",
     },
     {
       name: "z-index",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       interpolable: true,
       field_group: "box",
@@ -3378,6 +3684,7 @@
     // CSS logical props
     {
       name: "inline-size",
+      property_class: "InlineSizeOrLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3386,6 +3693,7 @@
     },
     {
       name: "block-size",
+      property_class: "BlockSizeOrLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3394,6 +3702,7 @@
     },
     {
       name: "min-inline-size",
+      property_class: "MinInlineSizeOrMinLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3402,6 +3711,7 @@
     },
     {
       name: "min-block-size",
+      property_class: "MinBlockSizeOrMinLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3410,6 +3720,7 @@
     },
     {
       name: "max-inline-size",
+      property_class: "MaxInlineSizeOrMaxLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3418,6 +3729,7 @@
     },
     {
       name: "max-block-size",
+      property_class: "MaxBlockSizeOrMaxLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3429,6 +3741,7 @@
 
     {
       name: "-webkit-border-end-color",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "end",
@@ -3437,6 +3750,7 @@
     },
     {
       name: "-webkit-border-end-style",
+      property_class: true,
       direction_aware_options: {
         logical_side: "end",
         shorthand_for_physical_side: "borderStyleShorthand",
@@ -3444,6 +3758,7 @@
     },
     {
       name: "-webkit-border-end-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "end",
@@ -3452,6 +3767,7 @@
     },
     {
       name: "-webkit-border-start-color",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "start",
@@ -3460,6 +3776,7 @@
     },
     {
       name: "-webkit-border-start-style",
+      property_class: true,
       direction_aware_options: {
         logical_side: "start",
         shorthand_for_physical_side: "borderStyleShorthand",
@@ -3467,6 +3784,7 @@
     },
     {
       name: "-webkit-border-start-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "start",
@@ -3475,6 +3793,7 @@
     },
     {
       name: "-webkit-border-before-color",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "before",
@@ -3483,6 +3802,7 @@
     },
     {
       name: "-webkit-border-before-style",
+      property_class: true,
       direction_aware_options: {
         logical_side: "before",
         shorthand_for_physical_side: "borderStyleShorthand",
@@ -3490,6 +3810,7 @@
     },
     {
       name: "-webkit-border-before-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "before",
@@ -3498,6 +3819,7 @@
     },
     {
       name: "-webkit-border-after-color",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "after",
@@ -3506,6 +3828,7 @@
     },
     {
       name: "-webkit-border-after-style",
+      property_class: true,
       direction_aware_options: {
         logical_side: "after",
         shorthand_for_physical_side: "borderStyleShorthand",
@@ -3513,6 +3836,7 @@
     },
     {
       name: "-webkit-border-after-width",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "after",
@@ -3521,6 +3845,7 @@
     },
     {
       name: "-webkit-margin-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "end",
@@ -3529,6 +3854,7 @@
     },
     {
       name: "-webkit-margin-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "start",
@@ -3537,6 +3863,7 @@
     },
     {
       name: "-webkit-margin-before",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "before",
@@ -3545,6 +3872,7 @@
     },
     {
       name: "-webkit-margin-after",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "after",
@@ -3553,6 +3881,7 @@
     },
     {
       name: "-webkit-padding-end",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "end",
@@ -3561,6 +3890,7 @@
     },
     {
       name: "-webkit-padding-start",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "start",
@@ -3569,6 +3899,7 @@
     },
     {
       name: "-webkit-padding-before",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "before",
@@ -3577,6 +3908,7 @@
     },
     {
       name: "-webkit-padding-after",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "after",
@@ -3585,6 +3917,7 @@
     },
     {
       name: "-webkit-logical-width",
+      property_class: "InlineSizeOrLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3593,6 +3926,7 @@
     },
     {
       name: "-webkit-logical-height",
+      property_class: "BlockSizeOrLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3601,6 +3935,7 @@
     },
     {
       name: "-webkit-min-logical-width",
+      property_class: "MinInlineSizeOrMinLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3609,6 +3944,7 @@
     },
     {
       name: "-webkit-min-logical-height",
+      property_class: "MinBlockSizeOrMinLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3617,6 +3953,7 @@
     },
     {
       name: "-webkit-max-logical-width",
+      property_class: "MaxInlineSizeOrMaxLogicalWidth",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "width",
@@ -3625,6 +3962,7 @@
     },
     {
       name: "-webkit-max-logical-height",
+      property_class: "MaxBlockSizeOrMaxLogicalHeight",
       property_methods: ["ParseSingleValue"],
       direction_aware_options: {
         logical_side: "height",
@@ -3637,21 +3975,25 @@
     // StyleBuilder
     {
       name: "all",
+      property_class: true,
       affected_by_all: false,
       builder_skip: true,
     },
     {
       name: "page",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       builder_skip: true,
     },
     {
       name: "-webkit-font-size-delta",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       builder_skip: true,
     },
     {
       name: "-webkit-text-decorations-in-effect",
+      property_class: true,
       property_methods: ["ParseSingleValue"],
       inherited: true,
       builder_skip: true,
@@ -3660,36 +4002,43 @@
     // Descriptor only names
     {
       name: "font-display",
+      property_class: true,
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "max-zoom",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "min-zoom",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "orientation",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "src",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "unicode-range",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
     {
       name: "user-zoom",
+      property_class: "DescriptorOnly",
       is_descriptor: true,
       is_property: false,
     },
@@ -3702,6 +4051,7 @@
         "animation-delay", "animation-iteration-count", "animation-direction",
         "animation-fill-mode", "animation-play-state"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3712,16 +4062,19 @@
         "background-attachment", "background-origin", "background-clip",
         "background-color"
       ],
+      property_class: "Background",
       property_methods: ["ParseShorthand"],
     },
     {
       name: "background-position",
       longhands: ["background-position-x", "background-position-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "background-repeat",
       longhands: ["background-repeat-x", "background-repeat-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3734,6 +4087,7 @@
         "border-image-source", "border-image-slice", "border-image-width",
         "border-image-outset", "border-image-repeat"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3741,6 +4095,7 @@
       longhands: [
         "border-bottom-width", "border-bottom-style", "border-bottom-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3749,6 +4104,7 @@
         "border-top-color", "border-right-color", "border-bottom-color",
         "border-left-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3757,6 +4113,7 @@
         "border-image-source", "border-image-slice", "border-image-width",
         "border-image-outset", "border-image-repeat"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3764,6 +4121,7 @@
       longhands: [
         "border-left-width", "border-left-style", "border-left-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3772,6 +4130,7 @@
         "border-top-left-radius", "border-top-right-radius",
         "border-bottom-right-radius", "border-bottom-left-radius"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3779,6 +4138,7 @@
       longhands: [
         "border-right-width", "border-right-style", "border-right-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3786,6 +4146,7 @@
       longhands: [
         "-webkit-border-horizontal-spacing", "-webkit-border-vertical-spacing"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3794,6 +4155,7 @@
         "border-top-style", "border-right-style", "border-bottom-style",
         "border-left-style"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       keywords: ["none"],
       typedom_types: ["Image"],
@@ -3801,6 +4163,7 @@
     {
       name: "border-top",
       longhands: ["border-top-width", "border-top-style", "border-top-color"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3809,16 +4172,19 @@
         "border-top-width", "border-right-width", "border-bottom-width",
         "border-left-width"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "flex",
       longhands: ["flex-grow", "flex-shrink", "flex-basis"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "flex-flow",
       longhands: ["flex-direction", "flex-wrap"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3828,6 +4194,7 @@
         "font-variant-numeric", "font-variant-east-asian", "font-weight",
         "font-stretch", "font-size", "line-height", "font-family"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3836,6 +4203,7 @@
         "font-variant-ligatures", "font-variant-caps",
         "font-variant-numeric", "font-variant-east-asian"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       is_descriptor: true,
     },
@@ -3845,21 +4213,25 @@
         "grid-template-rows", "grid-template-columns", "grid-template-areas",
         "grid-auto-flow", "grid-auto-rows", "grid-auto-columns"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand", "IsLayoutDependent"],
     },
     {
       name: "place-content",
       longhands: ["align-content", "justify-content"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "place-items",
       longhands: ["align-items", "justify-items"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "place-self",
       longhands: ["align-self", "justify-self"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3868,21 +4240,25 @@
         "grid-row-start", "grid-column-start", "grid-row-end",
         "grid-column-end"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "grid-column",
       longhands: ["grid-column-start", "grid-column-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "grid-gap",
       longhands: ["grid-row-gap", "grid-column-gap"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "grid-row",
       longhands: ["grid-row-start", "grid-row-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3890,21 +4266,25 @@
       longhands: [
         "grid-template-rows", "grid-template-columns", "grid-template-areas"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand", "IsLayoutDependent"],
     },
     {
       name: "list-style",
       longhands: ["list-style-type", "list-style-position", "list-style-image"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "margin",
       longhands: ["margin-top", "margin-right", "margin-bottom", "margin-left"],
+      property_class: true,
       property_methods: ["ParseShorthand", "IsLayoutDependent"],
     },
     {
       name: "marker",
       longhands: ["marker-start", "marker-mid", "marker-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3913,21 +4293,25 @@
         "offset-position", "offset-path", "offset-distance", "offset-rotate",
         "offset-anchor"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "outline",
       longhands: ["outline-color", "outline-style", "outline-width"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "overflow",
       longhands: ["overflow-x", "overflow-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "overscroll-behavior",
       longhands: ["overscroll-behavior-x", "overscroll-behavior-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSOverscrollBehavior",
     },
@@ -3936,21 +4320,25 @@
       longhands: [
         "padding-top", "padding-right", "padding-bottom", "padding-left"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand", "IsLayoutDependent"],
     },
     {
       name: "page-break-after",
       longhands: ["break-after"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "page-break-before",
       longhands: ["break-before"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "page-break-inside",
       longhands: ["break-inside"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -3959,42 +4347,49 @@
         "scroll-padding-top", "scroll-padding-right", "scroll-padding-bottom",
         "scroll-padding-left"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "scroll-padding-block",
       longhands: ["scroll-padding-block-start", "scroll-padding-block-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "scroll-padding-inline",
       longhands: ["scroll-padding-inline-start", "scroll-padding-inline-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "scroll-snap-margin",
       longhands: ["scroll-snap-margin-top", "scroll-snap-margin-right", "scroll-snap-margin-bottom", "scroll-snap-margin-left"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "scroll-snap-margin-block",
       longhands: ["scroll-snap-margin-block-start", "scroll-snap-margin-block-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "scroll-snap-margin-inline",
       longhands: ["scroll-snap-margin-inline-start", "scroll-snap-margin-inline-end"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       runtime_flag: "CSSScrollSnapPoints",
     },
     {
       name: "text-decoration",
       longhands: ["text-decoration-line", "text-decoration-style", "text-decoration-color"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4003,6 +4398,7 @@
         "transition-property", "transition-duration",
         "transition-timing-function", "transition-delay"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4011,6 +4407,7 @@
         "-webkit-border-after-width", "-webkit-border-after-style",
         "-webkit-border-after-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       direction_aware_options: {
         logical_side: "after",
@@ -4023,6 +4420,7 @@
         "-webkit-border-before-width", "-webkit-border-before-style",
         "-webkit-border-before-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       direction_aware_options: {
         logical_side: "before",
@@ -4035,6 +4433,7 @@
         "-webkit-border-end-width", "-webkit-border-end-style",
         "-webkit-border-end-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       direction_aware_options: {
         logical_side: "end",
@@ -4047,6 +4446,7 @@
         "-webkit-border-start-width", "-webkit-border-start-style",
         "-webkit-border-start-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
       direction_aware_options: {
         logical_side: "start",
@@ -4056,16 +4456,19 @@
     {
       name: "-webkit-column-break-after",
       longhands: ["break-after"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-column-break-before",
       longhands: ["break-before"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-column-break-inside",
       longhands: ["break-inside"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4073,11 +4476,13 @@
       longhands: [
         "column-rule-width", "column-rule-style", "column-rule-color"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "columns",
       longhands: ["column-width", "column-count"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4085,6 +4490,7 @@
       longhands: [
         "-webkit-margin-before-collapse", "-webkit-margin-after-collapse"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4094,6 +4500,7 @@
         "-webkit-mask-position-y", "-webkit-mask-size", "-webkit-mask-repeat-x",
         "-webkit-mask-repeat-y", "-webkit-mask-origin", "-webkit-mask-clip"
       ],
+      property_class: "Background",
       property_methods: ["ParseShorthand"],
     },
     {
@@ -4103,310 +4510,384 @@
         "-webkit-mask-box-image-width", "-webkit-mask-box-image-outset",
         "-webkit-mask-box-image-repeat"
       ],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-mask-position",
       longhands: ["-webkit-mask-position-x", "-webkit-mask-position-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-mask-repeat",
       longhands: ["-webkit-mask-repeat-x", "-webkit-mask-repeat-y"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-text-emphasis",
       longhands: ["-webkit-text-emphasis-style", "-webkit-text-emphasis-color"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
     {
       name: "-webkit-text-stroke",
       longhands: ["-webkit-text-stroke-width", "-webkit-text-stroke-color"],
+      property_class: true,
       property_methods: ["ParseShorthand"],
     },
 
     // Aliases; these map to the same CSSPropertyID
     {
       name: "-epub-caption-side",
+      property_class: true,
       alias_for: "caption-side",
     },
     {
       name: "-epub-text-combine",
+      property_class: true,
       alias_for: "-webkit-text-combine",
     },
     {
       name: "-epub-text-emphasis",
+      property_class: true,
       alias_for: "-webkit-text-emphasis",
     },
     {
       name: "-epub-text-emphasis-color",
+      property_class: true,
       alias_for: "-webkit-text-emphasis-color",
     },
     {
       name: "-epub-text-emphasis-style",
+      property_class: true,
       alias_for: "-webkit-text-emphasis-style",
     },
     {
       name: "-epub-text-orientation",
+      property_class: true,
       alias_for: "-webkit-text-orientation",
     },
     {
       name: "-epub-text-transform",
+      property_class: true,
       alias_for: "text-transform",
     },
     {
       name: "-epub-word-break",
+      property_class: true,
       alias_for: "word-break",
     },
     {
       name: "-epub-writing-mode",
+      property_class: true,
       alias_for: "-webkit-writing-mode",
     },
     {
       name: "-webkit-align-content",
+      property_class: true,
       alias_for: "align-content",
     },
     {
       name: "-webkit-align-items",
+      property_class: true,
       alias_for: "align-items",
     },
     {
       name: "-webkit-align-self",
+      property_class: true,
       alias_for: "align-self",
     },
     {
       name: "-webkit-animation",
+      property_class: true,
       alias_for: "animation",
     },
     {
       name: "-webkit-animation-delay",
+      property_class: true,
       alias_for: "animation-delay",
     },
     {
       name: "-webkit-animation-direction",
+      property_class: true,
       alias_for: "animation-direction",
     },
     {
       name: "-webkit-animation-duration",
+      property_class: true,
       alias_for: "animation-duration",
     },
     {
       name: "-webkit-animation-fill-mode",
+      property_class: true,
       alias_for: "animation-fill-mode",
     },
     {
       name: "-webkit-animation-iteration-count",
+      property_class: true,
       alias_for: "animation-iteration-count",
     },
     {
       name: "-webkit-animation-name",
+      property_class: true,
       alias_for: "animation-name",
     },
     {
       name: "-webkit-animation-play-state",
+      property_class: true,
       alias_for: "animation-play-state",
     },
     {
       name: "-webkit-animation-timing-function",
+      property_class: true,
       alias_for: "animation-timing-function",
     },
     {
       name: "-webkit-backface-visibility",
+      property_class: true,
       alias_for: "backface-visibility",
     },
     // -webkit-background-clip accepts "content", "padding", and "border" values
     // See crbug.com/604023
     {
       name: "-webkit-background-clip",
+      property_class: true,
       alias_for: "background-clip",
     },
     // -webkit-background-origin accepts "content", "padding", and "border"
     // values. See crbug.com/604023
     {
       name: "-webkit-background-origin",
+      property_class: true,
       alias_for: "background-origin"
     },
     // "-webkit-background-size: 10px" behaves as "background-size: 10px 10px"
     {
       name: "-webkit-background-size",
+      property_class: true,
       alias_for: "background-size",
     },
     {
       name: "-webkit-border-bottom-left-radius",
+      property_class: true,
       alias_for: "border-bottom-left-radius",
     },
     {
       name: "-webkit-border-bottom-right-radius",
+      property_class: true,
       alias_for: "border-bottom-right-radius",
     },
     // "-webkit-border-radius: 1px 2px" behaves as "border-radius: 1px / 2px"
     {
       name: "-webkit-border-radius",
+      property_class: true,
       alias_for: "border-radius",
     },
     {
       name: "-webkit-border-top-left-radius",
+      property_class: true,
       alias_for: "border-top-left-radius",
     },
     {
       name: "-webkit-border-top-right-radius",
+      property_class: true,
       alias_for: "border-top-right-radius",
     },
     {
       name: "-webkit-box-shadow",
+      property_class: true,
       alias_for: "box-shadow",
     },
     {
       name: "-webkit-box-sizing",
+      property_class: true,
       alias_for: "box-sizing",
     },
     {
       name: "-webkit-clip-path",
+      property_class: true,
       alias_for: "clip-path",
     },
     {
       name: "-webkit-column-count",
+      property_class: true,
       alias_for: "column-count",
     },
     {
       name: "-webkit-column-gap",
+      property_class: true,
       alias_for: "column-gap",
     },
     {
       name: "-webkit-column-rule",
+      property_class: true,
       alias_for: "column-rule",
     },
     {
       name: "-webkit-column-rule-color",
+      property_class: true,
       alias_for: "column-rule-color",
     },
     {
       name: "-webkit-column-rule-style",
+      property_class: true,
       alias_for: "column-rule-style",
     },
     {
       name: "-webkit-column-rule-width",
+      property_class: true,
       alias_for: "column-rule-width",
     },
     {
       name: "-webkit-column-span",
+      property_class: true,
       alias_for: "column-span",
     },
     {
       name: "-webkit-column-width",
+      property_class: true,
       alias_for: "column-width",
     },
     {
       name: "-webkit-columns",
+      property_class: true,
       alias_for: "columns",
     },
     {
       name: "-webkit-filter",
+      property_class: true,
       alias_for: "filter",
     },
     {
       name: "-webkit-flex",
+      property_class: true,
       alias_for: "flex",
     },
     {
       name: "-webkit-flex-basis",
+      property_class: true,
       alias_for: "flex-basis",
     },
     {
       name: "-webkit-flex-direction",
+      property_class: true,
       alias_for: "flex-direction",
     },
     {
       name: "-webkit-flex-flow",
+      property_class: true,
       alias_for: "flex-flow",
     },
     {
       name: "-webkit-flex-grow",
+      property_class: true,
       alias_for: "flex-grow",
     },
     {
       name: "-webkit-flex-shrink",
+      property_class: true,
       alias_for: "flex-shrink",
     },
     {
       name: "-webkit-flex-wrap",
+      property_class: true,
       alias_for: "flex-wrap",
     },
     {
       name: "-webkit-font-feature-settings",
+      property_class: true,
       alias_for: "font-feature-settings",
     },
     {
       name: "-webkit-justify-content",
+      property_class: true,
       alias_for: "justify-content",
     },
     {
       name: "-webkit-opacity",
+      property_class: true,
       alias_for: "opacity",
     },
     {
       name: "-webkit-order",
+      property_class: true,
       alias_for: "order",
     },
     {
       name: "-webkit-perspective",
+      property_class: true,
       alias_for: "perspective",
     },
     {
       name: "-webkit-perspective-origin",
+      property_class: true,
       alias_for: "perspective-origin",
     },
     {
       name: "-webkit-shape-image-threshold",
+      property_class: true,
       alias_for: "shape-image-threshold",
     },
     {
       name: "-webkit-shape-margin",
+      property_class: true,
       alias_for: "shape-margin",
     },
     {
       name: "-webkit-shape-outside",
+      property_class: true,
       alias_for: "shape-outside",
     },
     {
       name: "-webkit-text-size-adjust",
+      property_class: true,
       alias_for: "text-size-adjust",
     },
     {
       name: "-webkit-transform",
+      property_class: true,
       alias_for: "transform",
     },
     {
       name: "-webkit-transform-origin",
+      property_class: true,
       alias_for: "transform-origin",
     },
     {
       name: "-webkit-transform-style",
+      property_class: true,
       alias_for: "transform-style",
     },
     {
       name: "-webkit-transition",
+      property_class: true,
       alias_for: "transition",
     },
     {
       name: "-webkit-transition-delay",
+      property_class: true,
       alias_for: "transition-delay",
     },
     {
       name: "-webkit-transition-duration",
+      property_class: true,
       alias_for: "transition-duration",
     },
     {
       name: "-webkit-transition-property",
+      property_class: true,
       alias_for: "transition-property",
     },
     {
       name: "-webkit-transition-timing-function",
+      property_class: true,
       alias_for: "transition-timing-function",
     },
     {
       name: "-webkit-user-select",
+      property_class: true,
       alias_for: "user-select",
     },
   ],
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index d415977..b6a910e 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -2235,9 +2235,12 @@
     const LayoutObject* layout_object,
     Node* styled_node,
     bool allow_visited_style) {
+  if (property.IDEquals(CSSPropertyInvalid))
+    return nullptr;
   const SVGComputedStyle& svg_style = style.SvgStyle();
   const CSSProperty& resolved_property = property.ResolveDirectionAwareProperty(
       style.Direction(), style.GetWritingMode());
+  DCHECK(!resolved_property.IDEquals(CSSPropertyInvalid));
   switch (resolved_property.PropertyID()) {
     case CSSPropertyBackgroundImage:
     case CSSPropertyWebkitMaskImage: {
diff --git a/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.cpp b/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.cpp
index 9723371..a7a9db5 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.cpp
+++ b/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.cpp
@@ -25,7 +25,6 @@
 #include "core/css/CSSRayValue.h"
 #include "core/css/CSSShadowValue.h"
 #include "core/css/CSSTimingFunctionValue.h"
-#include "core/css/CSSURIValue.h"
 #include "core/css/CSSValue.h"
 #include "core/css/CSSValueList.h"
 #include "core/css/CSSValuePair.h"
@@ -846,190 +845,6 @@
   return nullptr;
 }
 
-CSSValue* ParseBackgroundBox(CSSParserTokenRange& range,
-                             const CSSParserLocalContext& local_context) {
-  // This is legacy behavior that does not match spec, see crbug.com/604023
-  if (local_context.UseAliasParsing()) {
-    return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-        ConsumePrefixedBackgroundBox, range, AllowTextValue::kAllow);
-  }
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      ConsumeBackgroundBox, range);
-}
-
-CSSValue* ParseBackgroundOrMaskSize(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      ConsumeBackgroundSize, range, context.Mode(),
-      local_context.UseAliasParsing() ? ParsingStyle::kLegacy
-                                      : ParsingStyle::kNotLegacy);
-}
-
-namespace {
-
-CSSValue* ConsumeBackgroundComponent(CSSPropertyID resolved_property,
-                                     CSSParserTokenRange& range,
-                                     const CSSParserContext& context) {
-  switch (resolved_property) {
-    case CSSPropertyBackgroundClip:
-      return ConsumeBackgroundBox(range);
-    case CSSPropertyBackgroundAttachment:
-      return ConsumeBackgroundAttachment(range);
-    case CSSPropertyBackgroundOrigin:
-      return ConsumeBackgroundBox(range);
-    case CSSPropertyBackgroundImage:
-    case CSSPropertyWebkitMaskImage:
-      return CSSPropertyParserHelpers::ConsumeImageOrNone(range, &context);
-    case CSSPropertyBackgroundPositionX:
-    case CSSPropertyWebkitMaskPositionX:
-      return ConsumePositionLonghand<CSSValueLeft, CSSValueRight>(
-          range, context.Mode());
-    case CSSPropertyBackgroundPositionY:
-    case CSSPropertyWebkitMaskPositionY:
-      return ConsumePositionLonghand<CSSValueTop, CSSValueBottom>(
-          range, context.Mode());
-    case CSSPropertyBackgroundSize:
-    case CSSPropertyWebkitMaskSize:
-      return ConsumeBackgroundSize(range, context.Mode(),
-                                   ParsingStyle::kNotLegacy);
-    case CSSPropertyBackgroundColor:
-      return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
-    case CSSPropertyWebkitMaskClip:
-      return ConsumePrefixedBackgroundBox(range, AllowTextValue::kAllow);
-    case CSSPropertyWebkitMaskOrigin:
-      return ConsumePrefixedBackgroundBox(range, AllowTextValue::kForbid);
-    default:
-      break;
-  };
-  return nullptr;
-}
-
-}  // namespace
-
-// Note: this assumes y properties (e.g. background-position-y) follow the x
-// properties in the shorthand array.
-// TODO(jiameng): this is used by background and -webkit-mask, hence we
-// need local_context as an input that contains shorthand id. We will consider
-// remove local_context as an input after
-//   (i). StylePropertyShorthand is refactored and
-//   (ii). we split parsing logic of background and -webkit-mask into
-//   different property classes.
-bool ParseBackgroundOrMask(bool important,
-                           CSSParserTokenRange& range,
-                           const CSSParserContext& context,
-                           const CSSParserLocalContext& local_context,
-                           HeapVector<CSSPropertyValue, 256>& properties) {
-  CSSPropertyID shorthand_id = local_context.CurrentShorthand();
-  DCHECK(shorthand_id == CSSPropertyBackground ||
-         shorthand_id == CSSPropertyWebkitMask);
-  const StylePropertyShorthand& shorthand =
-      shorthand_id == CSSPropertyBackground ? backgroundShorthand()
-                                            : webkitMaskShorthand();
-
-  const unsigned longhand_count = shorthand.length();
-  CSSValue* longhands[10] = {nullptr};
-  DCHECK_LE(longhand_count, 10u);
-
-  bool implicit = false;
-  do {
-    bool parsed_longhand[10] = {false};
-    CSSValue* origin_value = nullptr;
-    do {
-      bool found_property = false;
-      for (size_t i = 0; i < longhand_count; ++i) {
-        if (parsed_longhand[i])
-          continue;
-
-        CSSValue* value = nullptr;
-        CSSValue* value_y = nullptr;
-        const CSSProperty& property = *shorthand.properties()[i];
-        if (property.IDEquals(CSSPropertyBackgroundRepeatX) ||
-            property.IDEquals(CSSPropertyWebkitMaskRepeatX)) {
-          ConsumeRepeatStyleComponent(range, value, value_y, implicit);
-        } else if (property.IDEquals(CSSPropertyBackgroundPositionX) ||
-                   property.IDEquals(CSSPropertyWebkitMaskPositionX)) {
-          if (!CSSPropertyParserHelpers::ConsumePosition(
-                  range, context,
-                  CSSPropertyParserHelpers::UnitlessQuirk::kForbid,
-                  WebFeature::kThreeValuedPositionBackground, value, value_y))
-            continue;
-        } else if (property.IDEquals(CSSPropertyBackgroundSize) ||
-                   property.IDEquals(CSSPropertyWebkitMaskSize)) {
-          if (!CSSPropertyParserHelpers::ConsumeSlashIncludingWhitespace(range))
-            continue;
-          value = ConsumeBackgroundSize(range, context.Mode(),
-                                        ParsingStyle::kNotLegacy);
-          if (!value ||
-              !parsed_longhand[i - 1])  // Position must have been
-                                        // parsed in the current layer.
-          {
-            return false;
-          }
-        } else if (property.IDEquals(CSSPropertyBackgroundPositionY) ||
-                   property.IDEquals(CSSPropertyBackgroundRepeatY) ||
-                   property.IDEquals(CSSPropertyWebkitMaskPositionY) ||
-                   property.IDEquals(CSSPropertyWebkitMaskRepeatY)) {
-          continue;
-        } else {
-          value =
-              ConsumeBackgroundComponent(property.PropertyID(), range, context);
-        }
-        if (value) {
-          if (property.IDEquals(CSSPropertyBackgroundOrigin) ||
-              property.IDEquals(CSSPropertyWebkitMaskOrigin)) {
-            origin_value = value;
-          }
-          parsed_longhand[i] = true;
-          found_property = true;
-          AddBackgroundValue(longhands[i], value);
-          if (value_y) {
-            parsed_longhand[i + 1] = true;
-            AddBackgroundValue(longhands[i + 1], value_y);
-          }
-        }
-      }
-      if (!found_property)
-        return false;
-    } while (!range.AtEnd() && range.Peek().GetType() != kCommaToken);
-
-    // TODO(timloh): This will make invalid longhands, see crbug.com/386459
-    for (size_t i = 0; i < longhand_count; ++i) {
-      const CSSProperty& property = *shorthand.properties()[i];
-      if (property.IDEquals(CSSPropertyBackgroundColor) && !range.AtEnd()) {
-        if (parsed_longhand[i])
-          return false;  // Colors are only allowed in the last layer.
-        continue;
-      }
-      if ((property.IDEquals(CSSPropertyBackgroundClip) ||
-           property.IDEquals(CSSPropertyWebkitMaskClip)) &&
-          !parsed_longhand[i] && origin_value) {
-        AddBackgroundValue(longhands[i], origin_value);
-        continue;
-      }
-      if (!parsed_longhand[i]) {
-        AddBackgroundValue(longhands[i], CSSInitialValue::Create());
-      }
-    }
-  } while (CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(range));
-  if (!range.AtEnd())
-    return false;
-
-  for (size_t i = 0; i < longhand_count; ++i) {
-    const CSSProperty& property = *shorthand.properties()[i];
-    if (property.IDEquals(CSSPropertyBackgroundSize) && longhands[i] &&
-        context.UseLegacyBackgroundSizeShorthandBehavior())
-      continue;
-    CSSPropertyParserHelpers::AddProperty(
-        property.PropertyID(), shorthand.id(), *longhands[i], important,
-        implicit ? CSSPropertyParserHelpers::IsImplicitProperty::kImplicit
-                 : CSSPropertyParserHelpers::IsImplicitProperty::kNotImplicit,
-        properties);
-  }
-  return true;
-}
-
 bool ConsumeRepeatStyleComponent(CSSParserTokenRange& range,
                                  CSSValue*& value1,
                                  CSSValue*& value2,
@@ -1223,33 +1038,6 @@
                               CSSQuadValue::kSerializeAsQuad);
 }
 
-CSSValue* ParseBorderRadiusCorner(CSSParserTokenRange& range,
-                                  const CSSParserContext& context) {
-  CSSValue* parsed_value1 = CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative);
-  if (!parsed_value1)
-    return nullptr;
-  CSSValue* parsed_value2 = CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative);
-  if (!parsed_value2)
-    parsed_value2 = parsed_value1;
-  return CSSValuePair::Create(parsed_value1, parsed_value2,
-                              CSSValuePair::kDropIdenticalValues);
-}
-
-CSSValue* ParseBorderWidthSide(CSSParserTokenRange& range,
-                               const CSSParserContext& context,
-                               const CSSParserLocalContext& local_context) {
-  CSSPropertyID shorthand = local_context.CurrentShorthand();
-  bool allow_quirky_lengths =
-      IsQuirksModeBehavior(context.Mode()) &&
-      (shorthand == CSSPropertyInvalid || shorthand == CSSPropertyBorderWidth);
-  CSSPropertyParserHelpers::UnitlessQuirk unitless =
-      allow_quirky_lengths ? CSSPropertyParserHelpers::UnitlessQuirk::kAllow
-                           : CSSPropertyParserHelpers::UnitlessQuirk::kForbid;
-  return ConsumeBorderWidth(range, context.Mode(), unitless);
-}
-
 CSSValue* ConsumeShadow(CSSParserTokenRange& range,
                         CSSParserMode css_parser_mode,
                         AllowInsetAndSpread inset_and_spread) {
@@ -2546,39 +2334,5 @@
                                                     unitless);
 }
 
-CSSValue* ParseSpacing(CSSParserTokenRange& range,
-                       const CSSParserContext& context) {
-  if (range.Peek().Id() == CSSValueNormal)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  // TODO(timloh): allow <percentage>s in word-spacing.
-  return CSSPropertyParserHelpers::ConsumeLength(
-      range, context.Mode(), kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-CSSValue* ParsePaintStroke(CSSParserTokenRange& range,
-                           const CSSParserContext& context) {
-  if (range.Peek().Id() == CSSValueNone)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  CSSURIValue* url = CSSPropertyParserHelpers::ConsumeUrl(range, &context);
-  if (url) {
-    CSSValue* parsed_value = nullptr;
-    if (range.Peek().Id() == CSSValueNone) {
-      parsed_value = CSSPropertyParserHelpers::ConsumeIdent(range);
-    } else {
-      parsed_value =
-          CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
-    }
-    if (parsed_value) {
-      CSSValueList* values = CSSValueList::CreateSpaceSeparated();
-      values->Append(*url);
-      values->Append(*parsed_value);
-      return values;
-    }
-    return url;
-  }
-  return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
-}
-
 }  // namespace CSSParsingUtils
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.h b/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.h
index 8af21eb..d7e74e10 100644
--- a/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.h
+++ b/third_party/WebKit/Source/core/css/properties/CSSParsingUtils.h
@@ -73,16 +73,6 @@
                                CSSValue*& result_x,
                                CSSValue*& result_y);
 CSSValue* ConsumePrefixedBackgroundBox(CSSParserTokenRange&, AllowTextValue);
-CSSValue* ParseBackgroundBox(CSSParserTokenRange&,
-                             const CSSParserLocalContext&);
-CSSValue* ParseBackgroundOrMaskSize(CSSParserTokenRange&,
-                                    const CSSParserContext&,
-                                    const CSSParserLocalContext&);
-bool ParseBackgroundOrMask(bool,
-                           CSSParserTokenRange&,
-                           const CSSParserContext&,
-                           const CSSParserLocalContext&,
-                           HeapVector<CSSPropertyValue, 256>&);
 
 bool ConsumeRepeatStyleComponent(CSSParserTokenRange&,
                                  CSSValue*& value1,
@@ -108,12 +98,6 @@
 CSSValue* ConsumeBorderImageWidth(CSSParserTokenRange&);
 CSSValue* ConsumeBorderImageOutset(CSSParserTokenRange&);
 
-CSSValue* ParseBorderRadiusCorner(CSSParserTokenRange&,
-                                  const CSSParserContext&);
-CSSValue* ParseBorderWidthSide(CSSParserTokenRange&,
-                               const CSSParserContext&,
-                               const CSSParserLocalContext&);
-
 CSSValue* ConsumeShadow(CSSParserTokenRange&,
                         CSSParserMode,
                         AllowInsetAndSpread);
@@ -219,8 +203,6 @@
 CSSValue* ConsumeBorderWidth(CSSParserTokenRange&,
                              CSSParserMode,
                              CSSPropertyParserHelpers::UnitlessQuirk);
-CSSValue* ParsePaintStroke(CSSParserTokenRange&, const CSSParserContext&);
-CSSValue* ParseSpacing(CSSParserTokenRange&, const CSSParserContext&);
 
 template <CSSValueID start, CSSValueID end>
 CSSValue* ConsumePositionLonghand(CSSParserTokenRange& range,
diff --git a/third_party/WebKit/Source/core/css/properties/Longhand.h b/third_party/WebKit/Source/core/css/properties/Longhand.h
index 5d44172..036d8168 100644
--- a/third_party/WebKit/Source/core/css/properties/Longhand.h
+++ b/third_party/WebKit/Source/core/css/properties/Longhand.h
@@ -16,6 +16,8 @@
 
 class Longhand : public CSSProperty {
  public:
+  constexpr Longhand(CSSPropertyID id) : CSSProperty(id) {}
+
   // Parses and consumes a longhand property value from the token range.
   // Returns nullptr if the input is invalid.
   virtual const CSSValue* ParseSingleValue(CSSParserTokenRange&,
@@ -34,9 +36,6 @@
     return Color();
   }
   bool IsLonghand() const override { return true; }
-
- protected:
-  constexpr Longhand() : CSSProperty() {}
 };
 
 DEFINE_TYPE_CASTS(Longhand,
diff --git a/third_party/WebKit/Source/core/css/properties/Shorthand.h b/third_party/WebKit/Source/core/css/properties/Shorthand.h
index 1082ae8e..38205f3 100644
--- a/third_party/WebKit/Source/core/css/properties/Shorthand.h
+++ b/third_party/WebKit/Source/core/css/properties/Shorthand.h
@@ -13,6 +13,8 @@
 
 class Shorthand : public CSSProperty {
  public:
+  constexpr Shorthand(CSSPropertyID id) : CSSProperty(id) {}
+
   // Parses and consumes entire shorthand value from the token range and adds
   // all constituent parsed longhand properties to the 'properties' set.
   // Returns false if the input is invalid.
@@ -26,9 +28,6 @@
     return false;
   }
   bool IsShorthand() const override { return true; }
-
- protected:
-  constexpr Shorthand() : CSSProperty() {}
 };
 
 DEFINE_TYPE_CASTS(Shorthand,
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/AlignContent.cpp b/third_party/WebKit/Source/core/css/properties/longhands/AlignOrJustifyContent.cpp
similarity index 80%
rename from third_party/WebKit/Source/core/css/properties/longhands/AlignContent.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/AlignOrJustifyContent.cpp
index 0ce3ced..01aaf02 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/AlignContent.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/AlignOrJustifyContent.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/AlignContent.h"
+#include "core/css/properties/longhands/AlignOrJustifyContent.h"
 
 #include "core/css/properties/CSSParsingUtils.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* AlignContent::ParseSingleValue(
+const CSSValue* AlignOrJustifyContent::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/AnimationDelay.cpp b/third_party/WebKit/Source/core/css/properties/longhands/AnimationDelay.cpp
deleted file mode 100644
index 5211a6c..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/AnimationDelay.cpp
+++ /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 "core/css/properties/longhands/AnimationDelay.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "platform/Length.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* AnimationDelay::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSPropertyParserHelpers::ConsumeTime, range, kValueRangeAll);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/AnimationDuration.cpp b/third_party/WebKit/Source/core/css/properties/longhands/AnimationDuration.cpp
deleted file mode 100644
index e0f49ca..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/AnimationDuration.cpp
+++ /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 "core/css/properties/longhands/AnimationDuration.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "platform/Length.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* AnimationDuration::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSPropertyParserHelpers::ConsumeTime, range, kValueRangeNonNegative);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/AnimationTimingFunction.cpp b/third_party/WebKit/Source/core/css/properties/longhands/AnimationTimingFunction.cpp
deleted file mode 100644
index e4dd7b61..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/AnimationTimingFunction.cpp
+++ /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 "core/css/properties/longhands/AnimationTimingFunction.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* AnimationTimingFunction::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSParsingUtils::ConsumeAnimationTimingFunction, range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLocale.cpp b/third_party/WebKit/Source/core/css/properties/longhands/AutoOrString.cpp
similarity index 85%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitLocale.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/AutoOrString.cpp
index bf1aa5d..42078a0c 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLocale.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/AutoOrString.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitLocale.h"
+#include "core/css/properties/longhands/AutoOrString.h"
 
 #include "core/css/CSSStringValue.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitLocale::ParseSingleValue(
+const CSSValue* AutoOrString::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext&,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundBox.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundBox.cpp
new file mode 100644
index 0000000..0a52e0e
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundBox.cpp
@@ -0,0 +1,29 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/BackgroundBox.h"
+
+#include "core/css/parser/CSSParserLocalContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+#include "core/css/properties/CSSParsingUtils.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* BackgroundBox::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext&,
+    const CSSParserLocalContext& local_context) const {
+  // This is legacy behavior that does not match spec, see crbug.com/604023
+  if (local_context.UseAliasParsing()) {
+    return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
+        CSSParsingUtils::ConsumePrefixedBackgroundBox, range,
+        CSSParsingUtils::AllowTextValue::kAllow);
+  }
+  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
+      CSSParsingUtils::ConsumeBackgroundBox, range);
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundClip.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundClip.cpp
deleted file mode 100644
index d964c3a..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundClip.cpp
+++ /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 "core/css/properties/longhands/BackgroundClip.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BackgroundClip::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBackgroundBox(range, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundImage.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundImage.cpp
deleted file mode 100644
index 87b406a..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundImage.cpp
+++ /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 "core/css/properties/longhands/BackgroundImage.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BackgroundImage::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSPropertyParserHelpers::ConsumeImageOrNone, range, &context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskImage.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskImage.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskImage.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskImage.cpp
index cb0cc6ce..d5fc79e 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskImage.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskImage.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitMaskImage.h"
+#include "core/css/properties/longhands/BackgroundOrMaskImage.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitMaskImage::ParseSingleValue(
+const CSSValue* BackgroundOrMaskImage::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskSize.cpp
new file mode 100644
index 0000000..534ca4b4
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrMaskSize.cpp
@@ -0,0 +1,27 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/BackgroundOrMaskSize.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSParserLocalContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+#include "core/css/properties/CSSParsingUtils.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* BackgroundOrMaskSize::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
+      CSSParsingUtils::ConsumeBackgroundSize, range, context.Mode(),
+      local_context.UseAliasParsing()
+          ? CSSParsingUtils::ParsingStyle::kLegacy
+          : CSSParsingUtils::ParsingStyle::kNotLegacy);
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrigin.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrigin.cpp
deleted file mode 100644
index 7844995..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundOrigin.cpp
+++ /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 "core/css/properties/longhands/BackgroundOrigin.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BackgroundOrigin::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBackgroundBox(range, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BackgroundSize.cpp
deleted file mode 100644
index e93f0b3b..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundSize.cpp
+++ /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 "core/css/properties/longhands/BackgroundSize.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BackgroundSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBackgroundOrMaskSize(range, context,
-                                                    local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BlockSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BlockSize.cpp
deleted file mode 100644
index 1b7f2e9..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BlockSize.cpp
+++ /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 "core/css/properties/longhands/BlockSize.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BlockSizeOrLogicalHeight.cpp
similarity index 80%
copy from third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/BlockSizeOrLogicalHeight.cpp
index 1563005..e048b2a 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BlockSizeOrLogicalHeight.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/InlineSize.h"
+#include "core/css/properties/longhands/BlockSizeOrLogicalHeight.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* InlineSize::ParseSingleValue(
+const CSSValue* BlockSizeOrLogicalHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomLeftRadius.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomLeftRadius.cpp
deleted file mode 100644
index 0a08b7a..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomLeftRadius.cpp
+++ /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 "core/css/properties/longhands/BorderBottomLeftRadius.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderBottomLeftRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseBorderRadiusCorner(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomRightRadius.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomRightRadius.cpp
deleted file mode 100644
index e4789972..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomRightRadius.cpp
+++ /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 "core/css/properties/longhands/BorderBottomRightRadius.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderBottomRightRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseBorderRadiusCorner(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomWidth.cpp
deleted file mode 100644
index 45d5f24..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderBottomWidth.cpp
+++ /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 "core/css/properties/longhands/BorderBottomWidth.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderBottomWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBorderWidthSide(range, context, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderLeftWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderLeftWidth.cpp
deleted file mode 100644
index a977f7f..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderLeftWidth.cpp
+++ /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 "core/css/properties/longhands/BorderLeftWidth.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderLeftWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBorderWidthSide(range, context, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderRadiusCorner.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderRadiusCorner.cpp
new file mode 100644
index 0000000..3d4d19aa
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BorderRadiusCorner.cpp
@@ -0,0 +1,31 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/BorderRadiusCorner.h"
+
+#include "core/css/CSSValuePair.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* BorderRadiusCorner::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  CSSValue* parsed_value1 = CSSPropertyParserHelpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative);
+  if (!parsed_value1)
+    return nullptr;
+  CSSValue* parsed_value2 = CSSPropertyParserHelpers::ConsumeLengthOrPercent(
+      range, context.Mode(), kValueRangeNonNegative);
+  if (!parsed_value2)
+    parsed_value2 = parsed_value1;
+  return CSSValuePair::Create(parsed_value1, parsed_value2,
+                              CSSValuePair::kDropIdenticalValues);
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderRightWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderRightWidth.cpp
deleted file mode 100644
index 83742bf..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderRightWidth.cpp
+++ /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 "core/css/properties/longhands/BorderRightWidth.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderRightWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBorderWidthSide(range, context, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopLeftRadius.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderTopLeftRadius.cpp
deleted file mode 100644
index dc618cf..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopLeftRadius.cpp
+++ /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 "core/css/properties/longhands/BorderTopLeftRadius.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderTopLeftRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseBorderRadiusCorner(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopRightRadius.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderTopRightRadius.cpp
deleted file mode 100644
index c3d99e9..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopRightRadius.cpp
+++ /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 "core/css/properties/longhands/BorderTopRightRadius.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderTopRightRadius::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseBorderRadiusCorner(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderTopWidth.cpp
deleted file mode 100644
index 6c2eaea..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderTopWidth.cpp
+++ /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 "core/css/properties/longhands/BorderTopWidth.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* BorderTopWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBorderWidthSide(range, context, local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderWidthSide.cpp b/third_party/WebKit/Source/core/css/properties/longhands/BorderWidthSide.cpp
new file mode 100644
index 0000000..19eff834
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/BorderWidthSide.cpp
@@ -0,0 +1,31 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/BorderWidthSide.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSParserLocalContext.h"
+#include "core/css/parser/CSSParserMode.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+#include "core/css/properties/CSSParsingUtils.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* BorderWidthSide::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext& local_context) const {
+  CSSPropertyID shorthand = local_context.CurrentShorthand();
+  bool allow_quirky_lengths =
+      IsQuirksModeBehavior(context.Mode()) &&
+      (shorthand == CSSPropertyInvalid || shorthand == CSSPropertyBorderWidth);
+  CSSPropertyParserHelpers::UnitlessQuirk unitless =
+      allow_quirky_lengths ? CSSPropertyParserHelpers::UnitlessQuirk::kAllow
+                           : CSSPropertyParserHelpers::UnitlessQuirk::kForbid;
+  return CSSParsingUtils::ConsumeBorderWidth(range, context.Mode(), unitless);
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Bottom.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Bottom.cpp
deleted file mode 100644
index e1482690..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Bottom.cpp
+++ /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 "core/css/properties/longhands/Bottom.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* Bottom::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMarginOrOffset(
-      range, context.Mode(), CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-bool Bottom::IsLayoutDependent(const ComputedStyle* style,
-                               LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Cx.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Cx.cpp
deleted file mode 100644
index 0d59e054..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Cx.cpp
+++ /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 "core/css/properties/longhands/Cx.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Cx::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext&,
-                                     const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Cy.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Cy.cpp
deleted file mode 100644
index 850fcff..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Cy.cpp
+++ /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 "core/css/properties/longhands/Cy.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Cy::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext&,
-                                     const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/TransitionDelay.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Delay.cpp
similarity index 64%
rename from third_party/WebKit/Source/core/css/properties/longhands/TransitionDelay.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/Delay.cpp
index 941e7a4..d3a4bcf 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/TransitionDelay.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/Delay.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/TransitionDelay.h"
+#include "core/css/properties/longhands/Delay.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "platform/Length.h"
@@ -10,10 +10,9 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* TransitionDelay::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
+const CSSValue* Delay::ParseSingleValue(CSSParserTokenRange& range,
+                                        const CSSParserContext&,
+                                        const CSSParserLocalContext&) const {
   return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
       CSSPropertyParserHelpers::ConsumeTime, range, kValueRangeAll);
 }
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/FlexGrow.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Duration.cpp
similarity index 66%
rename from third_party/WebKit/Source/core/css/properties/longhands/FlexGrow.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/Duration.cpp
index a75cabf..058a65d 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/FlexGrow.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/Duration.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/FlexGrow.h"
+#include "core/css/properties/longhands/Duration.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "platform/Length.h"
@@ -10,10 +10,11 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* FlexGrow::ParseSingleValue(CSSParserTokenRange& range,
+const CSSValue* Duration::ParseSingleValue(CSSParserTokenRange& range,
                                            const CSSParserContext&,
                                            const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeNumber(range, kValueRangeNonNegative);
+  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
+      CSSPropertyParserHelpers::ConsumeTime, range, kValueRangeNonNegative);
 }
 
 }  // namespace CSSLonghand
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Fill.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Fill.cpp
deleted file mode 100644
index f79b4ca..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Fill.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/properties/longhands/Fill.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Fill::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParsePaintStroke(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/FillOpacity.cpp b/third_party/WebKit/Source/core/css/properties/longhands/FillOrStrokeOpacity.cpp
similarity index 81%
rename from third_party/WebKit/Source/core/css/properties/longhands/FillOpacity.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/FillOrStrokeOpacity.cpp
index 2a5c3b5f..dc6d214 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/FillOpacity.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/FillOrStrokeOpacity.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/FillOpacity.h"
+#include "core/css/properties/longhands/FillOrStrokeOpacity.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
@@ -12,7 +12,7 @@
 
 namespace CSSLonghand {
 
-const CSSValue* FillOpacity::ParseSingleValue(
+const CSSValue* FillOrStrokeOpacity::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/FlexShrink.cpp b/third_party/WebKit/Source/core/css/properties/longhands/FlexGrowOrShrink.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/FlexShrink.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/FlexGrowOrShrink.cpp
index b7dc1031..fd5af9c 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/FlexShrink.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/FlexGrowOrShrink.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/FlexShrink.h"
+#include "core/css/properties/longhands/FlexGrowOrShrink.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "platform/Length.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* FlexShrink::ParseSingleValue(
+const CSSValue* FlexGrowOrShrink::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext&,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/FloodOpacity.cpp b/third_party/WebKit/Source/core/css/properties/longhands/FloodOpacity.cpp
deleted file mode 100644
index 95154be..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/FloodOpacity.cpp
+++ /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 "core/css/properties/longhands/FloodOpacity.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* FloodOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp b/third_party/WebKit/Source/core/css/properties/longhands/FloodOrStopOpacity.cpp
similarity index 81%
rename from third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/FloodOrStopOpacity.cpp
index f8f6d23..a543c5cb 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/FloodOrStopOpacity.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/StopOpacity.h"
+#include "core/css/properties/longhands/FloodOrStopOpacity.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* StopOpacity::ParseSingleValue(
+const CSSValue* FloodOrStopOpacity::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridAutoColumns.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridAutoLine.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/css/properties/longhands/GridAutoColumns.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/GridAutoLine.cpp
index 4e82d10..a95828e3 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridAutoColumns.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/GridAutoLine.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/GridAutoColumns.h"
+#include "core/css/properties/longhands/GridAutoLine.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* GridAutoColumns::ParseSingleValue(
+const CSSValue* GridAutoLine::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridAutoRows.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridAutoRows.cpp
deleted file mode 100644
index a71f21c..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridAutoRows.cpp
+++ /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 "core/css/properties/longhands/GridAutoRows.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridAutoRows::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridTrackList(
-      range, context.Mode(), CSSParsingUtils::TrackListType::kGridAuto);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnEnd.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridColumnEnd.cpp
deleted file mode 100644
index 21262f9..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnEnd.cpp
+++ /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 "core/css/properties/longhands/GridColumnEnd.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridColumnEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridLine(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnStart.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridColumnStart.cpp
deleted file mode 100644
index e73384f..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnStart.cpp
+++ /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 "core/css/properties/longhands/GridColumnStart.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridColumnStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridLine(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MaxWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridLine.cpp
similarity index 64%
rename from third_party/WebKit/Source/core/css/properties/longhands/MaxWidth.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/GridLine.cpp
index 964203a..cbafad2 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/MaxWidth.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/GridLine.cpp
@@ -2,18 +2,17 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/MaxWidth.h"
+#include "core/css/properties/longhands/GridLine.h"
 
 #include "core/css/properties/CSSParsingUtils.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* MaxWidth::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
+const CSSValue* GridLine::ParseSingleValue(CSSParserTokenRange& range,
+                                           const CSSParserContext&,
                                            const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMaxWidthOrHeight(
-      range, context, CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
+  return CSSParsingUtils::ConsumeGridLine(range);
 }
 
 }  // namespace CSSLonghand
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridRowEnd.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridRowEnd.cpp
deleted file mode 100644
index 195dd42..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridRowEnd.cpp
+++ /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 "core/css/properties/longhands/GridRowEnd.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridRowEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridLine(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridRowGap.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridRowGap.cpp
deleted file mode 100644
index 12f52c0..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridRowGap.cpp
+++ /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 "core/css/properties/longhands/GridRowGap.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "platform/Length.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridRowGap::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnGap.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridRowOrColumnGap.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/css/properties/longhands/GridColumnGap.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/GridRowOrColumnGap.cpp
index 1759eaf..27b828e 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridColumnGap.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/GridRowOrColumnGap.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/GridColumnGap.h"
+#include "core/css/properties/longhands/GridRowOrColumnGap.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* GridColumnGap::ParseSingleValue(
+const CSSValue* GridRowOrColumnGap::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridRowStart.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridRowStart.cpp
deleted file mode 100644
index 493f17571..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridRowStart.cpp
+++ /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 "core/css/properties/longhands/GridRowStart.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridRowStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridLine(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateColumns.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateColumns.cpp
deleted file mode 100644
index 240d686..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateColumns.cpp
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/properties/longhands/GridTemplateColumns.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* GridTemplateColumns::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeGridTemplatesRowsOrColumns(range,
-                                                            context.Mode());
-}
-
-bool GridTemplateColumns::IsLayoutDependent(const ComputedStyle* style,
-                                            LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsLayoutGrid();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateRows.cpp b/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateLine.cpp
similarity index 81%
rename from third_party/WebKit/Source/core/css/properties/longhands/GridTemplateRows.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/GridTemplateLine.cpp
index 50eb588..9171ad88 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateRows.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/GridTemplateLine.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/GridTemplateRows.h"
+#include "core/css/properties/longhands/GridTemplateLine.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* GridTemplateRows::ParseSingleValue(
+const CSSValue* GridTemplateLine::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
@@ -19,7 +19,7 @@
                                                             context.Mode());
 }
 
-bool GridTemplateRows::IsLayoutDependent(const ComputedStyle* style,
+bool GridTemplateLine::IsLayoutDependent(const ComputedStyle* style,
                                          LayoutObject* layout_object) const {
   return layout_object && layout_object->IsLayoutGrid();
 }
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Height.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Height.cpp
deleted file mode 100644
index 8322d95..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Height.cpp
+++ /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 "core/css/properties/longhands/Height.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Height::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(
-      range, context, CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-bool Height::IsLayoutDependent(const ComputedStyle* style,
-                               LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BorderImageSource.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ImageSource.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/BorderImageSource.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/ImageSource.cpp
index 517a777..34c7d0f9 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/BorderImageSource.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/ImageSource.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/BorderImageSource.h"
+#include "core/css/properties/longhands/ImageSource.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
@@ -12,7 +12,7 @@
 
 namespace CSSLonghand {
 
-const CSSValue* BorderImageSource::ParseSingleValue(
+const CSSValue* ImageSource::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/InlineSizeOrLogicalWidth.cpp
similarity index 80%
rename from third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/InlineSizeOrLogicalWidth.cpp
index 1563005..6aa4098 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/InlineSizeOrLogicalWidth.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/InlineSize.h"
+#include "core/css/properties/longhands/InlineSizeOrLogicalWidth.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* InlineSize::ParseSingleValue(
+const CSSValue* InlineSizeOrLogicalWidth::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/JustifyContent.cpp b/third_party/WebKit/Source/core/css/properties/longhands/JustifyContent.cpp
deleted file mode 100644
index 15b3b830..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/JustifyContent.cpp
+++ /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 "core/css/properties/longhands/JustifyContent.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* JustifyContent::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeContentDistributionOverflowPosition(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Left.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Left.cpp
deleted file mode 100644
index 2b74aa9ae..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Left.cpp
+++ /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 "core/css/properties/longhands/Left.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* Left::ParseSingleValue(CSSParserTokenRange& range,
-                                       const CSSParserContext& context,
-                                       const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMarginOrOffset(
-      range, context.Mode(), CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-bool Left::IsLayoutDependent(const ComputedStyle* style,
-                             LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/LetterAndWordSpacing.cpp b/third_party/WebKit/Source/core/css/properties/longhands/LetterAndWordSpacing.cpp
new file mode 100644
index 0000000..2b8e352
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/LetterAndWordSpacing.cpp
@@ -0,0 +1,26 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/LetterAndWordSpacing.h"
+
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* LetterAndWordSpacing::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueNormal)
+    return CSSPropertyParserHelpers::ConsumeIdent(range);
+  // TODO(timloh): allow <percentage>s in word-spacing.
+  return CSSPropertyParserHelpers::ConsumeLength(
+      range, context.Mode(), kValueRangeAll,
+      CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/LetterSpacing.cpp b/third_party/WebKit/Source/core/css/properties/longhands/LetterSpacing.cpp
deleted file mode 100644
index 6fa4ce05..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/LetterSpacing.cpp
+++ /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 "core/css/properties/longhands/LetterSpacing.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* LetterSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseSpacing(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MarkerEnd.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MarkerEnd.cpp
deleted file mode 100644
index 3741a02..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MarkerEnd.cpp
+++ /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 "core/css/properties/longhands/MarkerEnd.h"
-
-#include "core/css/CSSURIValue.h"
-#include "core/css/parser/CSSParserTokenRange.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MarkerEnd::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueNone)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  return CSSPropertyParserHelpers::ConsumeUrl(range, &context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MarkerMid.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MarkerPoint.cpp
similarity index 86%
rename from third_party/WebKit/Source/core/css/properties/longhands/MarkerMid.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/MarkerPoint.cpp
index 038218c..fcd044a 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/MarkerMid.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MarkerPoint.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/MarkerMid.h"
+#include "core/css/properties/longhands/MarkerPoint.h"
 
 #include "core/css/CSSURIValue.h"
 #include "core/css/parser/CSSParserTokenRange.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* MarkerMid::ParseSingleValue(
+const CSSValue* MarkerPoint::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MarkerStart.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MarkerStart.cpp
deleted file mode 100644
index ccaea50..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MarkerStart.cpp
+++ /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 "core/css/properties/longhands/MarkerStart.h"
-
-#include "core/css/CSSURIValue.h"
-#include "core/css/parser/CSSParserTokenRange.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MarkerStart::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueNone)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  return CSSPropertyParserHelpers::ConsumeUrl(range, &context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSize.cpp
deleted file mode 100644
index b221f57..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSize.cpp
+++ /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 "core/css/properties/longhands/MaxBlockSize.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MaxBlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMaxWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSizeOrMaxLogicalHeight.cpp
similarity index 77%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSizeOrMaxLogicalHeight.cpp
index 3b30b83..379747a7 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MaxBlockSizeOrMaxLogicalHeight.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitMaxLogicalWidth.h"
+#include "core/css/properties/longhands/MaxBlockSizeOrMaxLogicalHeight.h"
 
 #include "core/css/properties/CSSParsingUtils.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitMaxLogicalWidth::ParseSingleValue(
+const CSSValue* MaxBlockSizeOrMaxLogicalHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSize.cpp
deleted file mode 100644
index 3c00bfb..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSize.cpp
+++ /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 "core/css/properties/longhands/MaxInlineSize.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MaxInlineSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMaxWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSizeOrMaxLogicalWidth.cpp
similarity index 77%
copy from third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSizeOrMaxLogicalWidth.cpp
index 3b30b83..3ee0311 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalWidth.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MaxInlineSizeOrMaxLogicalWidth.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitMaxLogicalWidth.h"
+#include "core/css/properties/longhands/MaxInlineSizeOrMaxLogicalWidth.h"
 
 #include "core/css/properties/CSSParsingUtils.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitMaxLogicalWidth::ParseSingleValue(
+const CSSValue* MaxInlineSizeOrMaxLogicalWidth::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MaxHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MaxWidthOrHeight.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/MaxHeight.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/MaxWidthOrHeight.cpp
index 3fd641ea..6a15e3b7 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/MaxHeight.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MaxWidthOrHeight.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/MaxHeight.h"
+#include "core/css/properties/longhands/MaxWidthOrHeight.h"
 
 #include "core/css/properties/CSSParsingUtils.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* MaxHeight::ParseSingleValue(
+const CSSValue* MaxWidthOrHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MinBlockSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinBlockSize.cpp
deleted file mode 100644
index 047cc915..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MinBlockSize.cpp
+++ /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 "core/css/properties/longhands/MinBlockSize.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MinBlockSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinBlockSizeOrMinLogicalHeight.cpp
similarity index 79%
copy from third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/MinBlockSizeOrMinLogicalHeight.cpp
index 1563005..7959fd5 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MinBlockSizeOrMinLogicalHeight.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/InlineSize.h"
+#include "core/css/properties/longhands/MinBlockSizeOrMinLogicalHeight.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* InlineSize::ParseSingleValue(
+const CSSValue* MinBlockSizeOrMinLogicalHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MinInlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinInlineSize.cpp
deleted file mode 100644
index 991eb696..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MinInlineSize.cpp
+++ /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 "core/css/properties/longhands/MinInlineSize.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* MinInlineSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinInlineSizeOrMinLogicalWidth.cpp
similarity index 79%
copy from third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/MinInlineSizeOrMinLogicalWidth.cpp
index 1563005..c3195cd2 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/InlineSize.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MinInlineSizeOrMinLogicalWidth.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/InlineSize.h"
+#include "core/css/properties/longhands/MinInlineSizeOrMinLogicalWidth.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* InlineSize::ParseSingleValue(
+const CSSValue* MinInlineSizeOrMinLogicalWidth::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MinWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinWidth.cpp
deleted file mode 100644
index 9218b564..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/MinWidth.cpp
+++ /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 "core/css/properties/longhands/MinWidth.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* MinWidth::ParseSingleValue(CSSParserTokenRange& range,
-                                           const CSSParserContext& context,
-                                           const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(
-      range, context, CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/MinWidthOrHeight.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/MinWidthOrHeight.cpp
index fb6828e..db17877 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/MinWidthOrHeight.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/MinHeight.h"
+#include "core/css/properties/longhands/MinWidthOrHeight.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -13,7 +13,7 @@
 
 namespace CSSLonghand {
 
-const CSSValue* MinHeight::ParseSingleValue(
+const CSSValue* MinWidthOrHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Top.cpp b/third_party/WebKit/Source/core/css/properties/longhands/OffsetSide.cpp
similarity index 63%
rename from third_party/WebKit/Source/core/css/properties/longhands/Top.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/OffsetSide.cpp
index 6d965c7f..ea7b3de 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/Top.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/OffsetSide.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/Top.h"
+#include "core/css/properties/longhands/OffsetSide.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -15,15 +15,16 @@
 
 namespace CSSLonghand {
 
-const CSSValue* Top::ParseSingleValue(CSSParserTokenRange& range,
-                                      const CSSParserContext& context,
-                                      const CSSParserLocalContext&) const {
+const CSSValue* OffsetSide::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
   return CSSParsingUtils::ConsumeMarginOrOffset(
       range, context.Mode(), CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
 }
 
-bool Top::IsLayoutDependent(const ComputedStyle* style,
-                            LayoutObject* layout_object) const {
+bool OffsetSide::IsLayoutDependent(const ComputedStyle* style,
+                                   LayoutObject* layout_object) const {
   return layout_object && layout_object->IsBox();
 }
 
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Orphans.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Orphans.cpp
deleted file mode 100644
index 7f360a1..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Orphans.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "core/css/properties/longhands/Orphans.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Orphans::ParseSingleValue(CSSParserTokenRange& range,
-                                          const CSSParserContext& context,
-                                          const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumePositiveInteger(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp b/third_party/WebKit/Source/core/css/properties/longhands/OrphansOrWidows.cpp
similarity index 70%
copy from third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/OrphansOrWidows.cpp
index f8f6d23..08f03bb 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/StopOpacity.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/OrphansOrWidows.cpp
@@ -1,19 +1,18 @@
 // Copyright 2017 The Chromium Authors. All rights reserved.
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
-
-#include "core/css/properties/longhands/StopOpacity.h"
+#include "core/css/properties/longhands/OrphansOrWidows.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* StopOpacity::ParseSingleValue(
+const CSSValue* OrphansOrWidows::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeNumber(range, kValueRangeAll);
+  return CSSPropertyParserHelpers::ConsumePositiveInteger(range);
 }
 
 }  // namespace CSSLonghand
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/PaintStroke.cpp b/third_party/WebKit/Source/core/css/properties/longhands/PaintStroke.cpp
new file mode 100644
index 0000000..5c60a69
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/longhands/PaintStroke.cpp
@@ -0,0 +1,43 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "core/css/properties/longhands/PaintStroke.h"
+
+#include "core/css/CSSURIValue.h"
+#include "core/css/CSSValue.h"
+#include "core/css/CSSValueList.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+
+namespace blink {
+namespace CSSLonghand {
+
+const CSSValue* PaintStroke::ParseSingleValue(
+    CSSParserTokenRange& range,
+    const CSSParserContext& context,
+    const CSSParserLocalContext&) const {
+  if (range.Peek().Id() == CSSValueNone)
+    return CSSPropertyParserHelpers::ConsumeIdent(range);
+  CSSURIValue* url = CSSPropertyParserHelpers::ConsumeUrl(range, &context);
+  if (url) {
+    CSSValue* parsed_value = nullptr;
+    if (range.Peek().Id() == CSSValueNone) {
+      parsed_value = CSSPropertyParserHelpers::ConsumeIdent(range);
+    } else {
+      parsed_value =
+          CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+    }
+    if (parsed_value) {
+      CSSValueList* values = CSSValueList::CreateSpaceSeparated();
+      values->Append(*url);
+      values->Append(*parsed_value);
+      return values;
+    }
+    return url;
+  }
+  return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+}
+
+}  // namespace CSSLonghand
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionX.cpp b/third_party/WebKit/Source/core/css/properties/longhands/PositionX.cpp
similarity index 85%
rename from third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionX.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/PositionX.cpp
index 877954d..f07f284 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionX.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/PositionX.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/BackgroundPositionX.h"
+#include "core/css/properties/longhands/PositionX.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* BackgroundPositionX::ParseSingleValue(
+const CSSValue* PositionX::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionY.cpp b/third_party/WebKit/Source/core/css/properties/longhands/PositionY.cpp
similarity index 85%
rename from third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionY.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/PositionY.cpp
index f2f0348..56741ab 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/BackgroundPositionY.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/PositionY.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/BackgroundPositionY.h"
+#include "core/css/properties/longhands/PositionY.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* BackgroundPositionY::ParseSingleValue(
+const CSSValue* PositionY::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/R.cpp b/third_party/WebKit/Source/core/css/properties/longhands/R.cpp
deleted file mode 100644
index e5416dda..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/R.cpp
+++ /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 "core/css/properties/longhands/R.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* R::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext&,
-                                    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Ry.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Radius.cpp
similarity index 68%
rename from third_party/WebKit/Source/core/css/properties/longhands/Ry.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/Radius.cpp
index 6c53c98..a90366645 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/Ry.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/Radius.cpp
@@ -2,16 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/Ry.h"
+#include "core/css/properties/longhands/Radius.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* Ry::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
+const CSSValue* Radius::ParseSingleValue(CSSParserTokenRange& range,
+                                         const CSSParserContext& context,
+                                         const CSSParserLocalContext&) const {
   if (range.Peek().Id() == CSSValueAuto)
     return CSSPropertyParserHelpers::ConsumeIdent(range);
   return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Right.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Right.cpp
deleted file mode 100644
index 58f66c2c..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Right.cpp
+++ /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 "core/css/properties/longhands/Right.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* Right::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMarginOrOffset(
-      range, context.Mode(), CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-bool Right::IsLayoutDependent(const ComputedStyle* style,
-                              LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Rx.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Rx.cpp
deleted file mode 100644
index 8a00b5fc..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Rx.cpp
+++ /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 "core/css/properties/longhands/Rx.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Rx::ParseSingleValue(CSSParserTokenRange& range,
-                                     const CSSParserContext& context,
-                                     const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueAuto)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingBottom.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingBottom.cpp
deleted file mode 100644
index 61caf13..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingBottom.cpp
+++ /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 "core/css/properties/longhands/ScrollPaddingBottom.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollPaddingBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingRight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingRight.cpp
deleted file mode 100644
index 0fced84..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingRight.cpp
+++ /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 "core/css/properties/longhands/ScrollPaddingRight.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollPaddingRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingLeft.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingSide.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingLeft.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingSide.cpp
index 65e3574..4ab33d97 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingLeft.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingSide.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/ScrollPaddingLeft.h"
+#include "core/css/properties/longhands/ScrollPaddingSide.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* ScrollPaddingLeft::ParseSingleValue(
+const CSSValue* ScrollPaddingSide::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingTop.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingTop.cpp
deleted file mode 100644
index e67d149..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollPaddingTop.cpp
+++ /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 "core/css/properties/longhands/ScrollPaddingTop.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollPaddingTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLengthOrPercent(
-      range, context.Mode(), kValueRangeNonNegative,
-      CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginBottom.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginBottom.cpp
deleted file mode 100644
index b55036a..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginBottom.cpp
+++ /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 "core/css/properties/longhands/ScrollSnapMarginBottom.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollSnapMarginBottom::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginRight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginRight.cpp
deleted file mode 100644
index 9294043..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginRight.cpp
+++ /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 "core/css/properties/longhands/ScrollSnapMarginRight.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollSnapMarginRight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginLeft.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginSide.cpp
similarity index 83%
rename from third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginLeft.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginSide.cpp
index 9488218..06e2bc7 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginLeft.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginSide.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/ScrollSnapMarginLeft.h"
+#include "core/css/properties/longhands/ScrollSnapMarginSide.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* ScrollSnapMarginLeft::ParseSingleValue(
+const CSSValue* ScrollSnapMarginSide::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginTop.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginTop.cpp
deleted file mode 100644
index 0cfcf40..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/ScrollSnapMarginTop.cpp
+++ /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 "core/css/properties/longhands/ScrollSnapMarginTop.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* ScrollSnapMarginTop::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return ConsumeLength(range, context.Mode(), kValueRangeAll,
-                       CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/ShapeLength.cpp
similarity index 84%
rename from third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/ShapeLength.cpp
index 35eb9b38..ee8411b0 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/ShapeLength.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/StrokeWidth.h"
+#include "core/css/properties/longhands/ShapeLength.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* StrokeWidth::ParseSingleValue(
+const CSSValue* ShapeLength::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext&,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Stroke.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Stroke.cpp
deleted file mode 100644
index 03bc02c..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Stroke.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "core/css/properties/longhands/Stroke.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Stroke::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParsePaintStroke(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffset.cpp b/third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffset.cpp
deleted file mode 100644
index f287e37..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffset.cpp
+++ /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 "core/css/properties/longhands/StrokeDashoffset.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* StrokeDashoffset::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffsetOrStrokeWidth.cpp
similarity index 80%
copy from third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffsetOrStrokeWidth.cpp
index 35eb9b38..a727df59 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/StrokeWidth.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/StrokeDashoffsetOrStrokeWidth.cpp
@@ -2,14 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/StrokeWidth.h"
+#include "core/css/properties/longhands/StrokeDashoffsetOrStrokeWidth.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* StrokeWidth::ParseSingleValue(
+const CSSValue* StrokeDashoffsetOrStrokeWidth::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext&,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/StrokeOpacity.cpp b/third_party/WebKit/Source/core/css/properties/longhands/StrokeOpacity.cpp
deleted file mode 100644
index 40d3474..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/StrokeOpacity.cpp
+++ /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 "core/css/properties/longhands/StrokeOpacity.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* StrokeOpacity::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeNumber(range, kValueRangeAll);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/TransitionTimingFunction.cpp b/third_party/WebKit/Source/core/css/properties/longhands/TimingFunction.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/TransitionTimingFunction.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/TimingFunction.cpp
index 5d6b07d0..243f270 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/TransitionTimingFunction.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/TimingFunction.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/TransitionTimingFunction.h"
+#include "core/css/properties/longhands/TimingFunction.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* TransitionTimingFunction::ParseSingleValue(
+const CSSValue* TimingFunction::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext&,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/TransitionDuration.cpp b/third_party/WebKit/Source/core/css/properties/longhands/TransitionDuration.cpp
deleted file mode 100644
index c494201..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/TransitionDuration.cpp
+++ /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 "core/css/properties/longhands/TransitionDuration.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "platform/Length.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* TransitionDuration::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSPropertyParserHelpers::ConsumeTime, range, kValueRangeNonNegative);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Variable.h b/third_party/WebKit/Source/core/css/properties/longhands/Variable.h
index ae06adf5..8fc6c900 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/Variable.h
+++ b/third_party/WebKit/Source/core/css/properties/longhands/Variable.h
@@ -13,18 +13,12 @@
 
 namespace blink {
 
-class Variable final : public CSSProperty {
+class Variable : public CSSProperty {
  public:
-  constexpr Variable() : CSSProperty() {}
+  constexpr Variable(CSSPropertyID id) : CSSProperty(id) {}
 
   bool IsInherited() const override { return true; }
   bool IsAffectedByAll() const override { return false; }
-  CSSPropertyID PropertyID() const override { return CSSPropertyVariable; }
-  const char* GetPropertyName() const override { return "variable\0"; }
-  const WTF::AtomicString& GetPropertyNameAtomicString() const override {
-    static const WTF::AtomicString& name = WTF::AtomicString("variable\0");
-    return name;
-  }
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderHorizontalSpacing.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderHorizontalSpacing.cpp
deleted file mode 100644
index e5f1659e..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderHorizontalSpacing.cpp
+++ /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 "core/css/properties/longhands/WebkitBorderHorizontalSpacing.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitBorderHorizontalSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLength(range, context.Mode(),
-                                                 kValueRangeNonNegative);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderVerticalSpacing.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderSpacing.cpp
similarity index 82%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderVerticalSpacing.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderSpacing.cpp
index 3615c90..aee86ac 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderVerticalSpacing.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/WebkitBorderSpacing.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitBorderVerticalSpacing.h"
+#include "core/css/properties/longhands/WebkitBorderSpacing.h"
 
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/parser/CSSPropertyParserHelpers.h"
@@ -10,7 +10,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitBorderVerticalSpacing::ParseSingleValue(
+const CSSValue* WebkitBorderSpacing::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitHyphenateCharacter.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitHyphenateCharacter.cpp
deleted file mode 100644
index 19e69b9..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitHyphenateCharacter.cpp
+++ /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 "core/css/properties/longhands/WebkitHyphenateCharacter.h"
-
-#include "core/css/CSSStringValue.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitHyphenateCharacter::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext&,
-    const CSSParserLocalContext&) const {
-  if (range.Peek().Id() == CSSValueAuto)
-    return CSSPropertyParserHelpers::ConsumeIdent(range);
-  return CSSPropertyParserHelpers::ConsumeString(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalHeight.cpp
deleted file mode 100644
index 0eac25d..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalHeight.cpp
+++ /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 "core/css/properties/longhands/WebkitLogicalHeight.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitLogicalHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalWidth.cpp
deleted file mode 100644
index c33086e0d..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitLogicalWidth.cpp
+++ /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 "core/css/properties/longhands/WebkitLogicalWidth.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitLogicalWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskBoxImageSource.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskBoxImageSource.cpp
deleted file mode 100644
index 28da535..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskBoxImageSource.cpp
+++ /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 "core/css/properties/longhands/WebkitMaskBoxImageSource.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-
-class CSSParserLocalContext;
-
-namespace CSSLonghand {
-
-const CSSValue* WebkitMaskBoxImageSource::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeImageOrNone(range, &context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionX.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionX.cpp
deleted file mode 100644
index 06ac674..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionX.cpp
+++ /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 "core/css/properties/longhands/WebkitMaskPositionX.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMaskPositionX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSParsingUtils::ConsumePositionLonghand<CSSValueLeft, CSSValueRight>,
-      range, context.Mode());
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionY.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionY.cpp
deleted file mode 100644
index 493ac4e..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskPositionY.cpp
+++ /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 "core/css/properties/longhands/WebkitMaskPositionY.h"
-
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMaskPositionY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
-      CSSParsingUtils::ConsumePositionLonghand<CSSValueTop, CSSValueBottom>,
-      range, context.Mode());
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskSize.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskSize.cpp
deleted file mode 100644
index 1a646dc..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaskSize.cpp
+++ /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 "core/css/properties/longhands/WebkitMaskSize.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMaskSize::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context) const {
-  return CSSParsingUtils::ParseBackgroundOrMaskSize(range, context,
-                                                    local_context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalHeight.cpp
deleted file mode 100644
index f72085a..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMaxLogicalHeight.cpp
+++ /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 "core/css/properties/longhands/WebkitMaxLogicalHeight.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMaxLogicalHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeMaxWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalHeight.cpp
deleted file mode 100644
index 71e88d22..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalHeight.cpp
+++ /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 "core/css/properties/longhands/WebkitMinLogicalHeight.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMinLogicalHeight::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalWidth.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalWidth.cpp
deleted file mode 100644
index 1aa27b4c..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitMinLogicalWidth.cpp
+++ /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 "core/css/properties/longhands/WebkitMinLogicalWidth.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitMinLogicalWidth::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginX.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginX.cpp
similarity index 83%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginX.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginX.cpp
index e9116de..8eb9847 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginX.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginX.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitTransformOriginX.h"
+#include "core/css/properties/longhands/WebkitOriginX.h"
 
 #include "core/CSSValueKeywords.h"
 #include "core/css/parser/CSSParserContext.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitTransformOriginX::ParseSingleValue(
+const CSSValue* WebkitOriginX::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginY.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginY.cpp
similarity index 83%
rename from third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginY.cpp
rename to third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginY.cpp
index 56e1f460..702ff81 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitTransformOriginY.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/WebkitOriginY.cpp
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/WebkitTransformOriginY.h"
+#include "core/css/properties/longhands/WebkitOriginY.h"
 
 #include "core/CSSValueKeywords.h"
 #include "core/css/parser/CSSParserContext.h"
@@ -11,7 +11,7 @@
 namespace blink {
 namespace CSSLonghand {
 
-const CSSValue* WebkitTransformOriginY::ParseSingleValue(
+const CSSValue* WebkitOriginY::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginX.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginX.cpp
deleted file mode 100644
index 69cfbe71..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginX.cpp
+++ /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 "core/css/properties/longhands/WebkitPerspectiveOriginX.h"
-
-#include "core/CSSValueKeywords.h"
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitPerspectiveOriginX::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumePositionLonghand<CSSValueLeft, CSSValueRight>(
-      range, context.Mode());
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginY.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginY.cpp
deleted file mode 100644
index 7ee565ad..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WebkitPerspectiveOriginY.cpp
+++ /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 "core/css/properties/longhands/WebkitPerspectiveOriginY.h"
-
-#include "core/CSSValueKeywords.h"
-#include "core/css/parser/CSSParserContext.h"
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WebkitPerspectiveOriginY::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumePositionLonghand<CSSValueTop, CSSValueBottom>(
-      range, context.Mode());
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Widows.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Widows.cpp
deleted file mode 100644
index e2215f4..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Widows.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright 2017 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-#include "core/css/properties/longhands/Widows.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Widows::ParseSingleValue(CSSParserTokenRange& range,
-                                         const CSSParserContext& context,
-                                         const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumePositiveInteger(range);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Width.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Width.cpp
deleted file mode 100644
index b8abc96..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Width.cpp
+++ /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 "core/css/properties/longhands/Width.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-#include "core/css/properties/CSSParsingUtils.h"
-#include "core/layout/LayoutObject.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Width::ParseSingleValue(CSSParserTokenRange& range,
-                                        const CSSParserContext& context,
-                                        const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ConsumeWidthOrHeight(
-      range, context, CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
-}
-
-bool Width::IsLayoutDependent(const ComputedStyle* style,
-                              LayoutObject* layout_object) const {
-  return layout_object && layout_object->IsBox();
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WidthOrHeight.cpp
similarity index 64%
copy from third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp
copy to third_party/WebKit/Source/core/css/properties/longhands/WidthOrHeight.cpp
index fb6828e..4038f44 100644
--- a/third_party/WebKit/Source/core/css/properties/longhands/MinHeight.cpp
+++ b/third_party/WebKit/Source/core/css/properties/longhands/WidthOrHeight.cpp
@@ -2,18 +2,16 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "core/css/properties/longhands/MinHeight.h"
+#include "core/css/properties/longhands/WidthOrHeight.h"
 
 #include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
+#include "core/layout/LayoutObject.h"
 
 namespace blink {
-
-class CSSParserLocalContext;
-
 namespace CSSLonghand {
 
-const CSSValue* MinHeight::ParseSingleValue(
+const CSSValue* WidthOrHeight::ParseSingleValue(
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext&) const {
@@ -21,5 +19,10 @@
       range, context, CSSPropertyParserHelpers::UnitlessQuirk::kAllow);
 }
 
+bool WidthOrHeight::IsLayoutDependent(const ComputedStyle* style,
+                                      LayoutObject* layout_object) const {
+  return layout_object && layout_object->IsBox();
+}
+
 }  // namespace CSSLonghand
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/WordSpacing.cpp b/third_party/WebKit/Source/core/css/properties/longhands/WordSpacing.cpp
deleted file mode 100644
index 0f95579..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/WordSpacing.cpp
+++ /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 "core/css/properties/longhands/WordSpacing.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* WordSpacing::ParseSingleValue(
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext&) const {
-  return CSSParsingUtils::ParseSpacing(range, context);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/X.cpp b/third_party/WebKit/Source/core/css/properties/longhands/X.cpp
deleted file mode 100644
index 179ad6f..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/X.cpp
+++ /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 "core/css/properties/longhands/X.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* X::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext&,
-                                    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/longhands/Y.cpp b/third_party/WebKit/Source/core/css/properties/longhands/Y.cpp
deleted file mode 100644
index 13c07c30..0000000
--- a/third_party/WebKit/Source/core/css/properties/longhands/Y.cpp
+++ /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 "core/css/properties/longhands/Y.h"
-
-#include "core/css/parser/CSSPropertyParserHelpers.h"
-
-namespace blink {
-namespace CSSLonghand {
-
-const CSSValue* Y::ParseSingleValue(CSSParserTokenRange& range,
-                                    const CSSParserContext&,
-                                    const CSSParserLocalContext&) const {
-  return CSSPropertyParserHelpers::ConsumeLengthOrPercent(
-      range, kSVGAttributeMode, kValueRangeAll,
-      CSSPropertyParserHelpers::UnitlessQuirk::kForbid);
-}
-
-}  // namespace CSSLonghand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/shorthands/Background.cpp b/third_party/WebKit/Source/core/css/properties/shorthands/Background.cpp
index e43747c..d6f32f16 100644
--- a/third_party/WebKit/Source/core/css/properties/shorthands/Background.cpp
+++ b/third_party/WebKit/Source/core/css/properties/shorthands/Background.cpp
@@ -4,19 +4,184 @@
 
 #include "core/css/properties/shorthands/Background.h"
 
+#include "core/StylePropertyShorthand.h"
+#include "core/css/CSSInitialValue.h"
+#include "core/css/parser/CSSParserContext.h"
+#include "core/css/parser/CSSParserLocalContext.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
 #include "core/css/properties/CSSParsingUtils.h"
+#include "core/frame/WebFeature.h"
 
 namespace blink {
+namespace {
+
+CSSValue* ConsumeBackgroundComponent(CSSPropertyID resolved_property,
+                                     CSSParserTokenRange& range,
+                                     const CSSParserContext& context) {
+  switch (resolved_property) {
+    case CSSPropertyBackgroundClip:
+      return CSSParsingUtils::ConsumeBackgroundBox(range);
+    case CSSPropertyBackgroundAttachment:
+      return CSSParsingUtils::ConsumeBackgroundAttachment(range);
+    case CSSPropertyBackgroundOrigin:
+      return CSSParsingUtils::ConsumeBackgroundBox(range);
+    case CSSPropertyBackgroundImage:
+    case CSSPropertyWebkitMaskImage:
+      return CSSPropertyParserHelpers::ConsumeImageOrNone(range, &context);
+    case CSSPropertyBackgroundPositionX:
+    case CSSPropertyWebkitMaskPositionX:
+      return CSSParsingUtils::ConsumePositionLonghand<CSSValueLeft,
+                                                      CSSValueRight>(
+          range, context.Mode());
+    case CSSPropertyBackgroundPositionY:
+    case CSSPropertyWebkitMaskPositionY:
+      return CSSParsingUtils::ConsumePositionLonghand<CSSValueTop,
+                                                      CSSValueBottom>(
+          range, context.Mode());
+    case CSSPropertyBackgroundSize:
+    case CSSPropertyWebkitMaskSize:
+      return CSSParsingUtils::ConsumeBackgroundSize(
+          range, context.Mode(), CSSParsingUtils::ParsingStyle::kNotLegacy);
+    case CSSPropertyBackgroundColor:
+      return CSSPropertyParserHelpers::ConsumeColor(range, context.Mode());
+    case CSSPropertyWebkitMaskClip:
+      return CSSParsingUtils::ConsumePrefixedBackgroundBox(
+          range, CSSParsingUtils::AllowTextValue::kAllow);
+    case CSSPropertyWebkitMaskOrigin:
+      return CSSParsingUtils::ConsumePrefixedBackgroundBox(
+          range, CSSParsingUtils::AllowTextValue::kForbid);
+    default:
+      break;
+  };
+  return nullptr;
+}
+
+}  // namespace
 namespace CSSShorthand {
 
+// Note: this assumes y properties (e.g. background-position-y) follow the x
+// properties in the shorthand array.
+// TODO(jiameng): this class is used by background and -webkit-mask, hence we
+// need local_context as an input that contains shorthand id. We will consider
+// remove local_context as an input after
+//   (i). StylePropertyShorthand is refactored and
+//   (ii). we split parsing logic of background and -webkit-mask into
+//   different property classes.
 bool Background::ParseShorthand(
     bool important,
     CSSParserTokenRange& range,
     const CSSParserContext& context,
     const CSSParserLocalContext& local_context,
     HeapVector<CSSPropertyValue, 256>& properties) const {
-  return CSSParsingUtils::ParseBackgroundOrMask(important, range, context,
-                                                local_context, properties);
+  CSSPropertyID shorthand_id = local_context.CurrentShorthand();
+  DCHECK(shorthand_id == CSSPropertyBackground ||
+         shorthand_id == CSSPropertyWebkitMask);
+  const StylePropertyShorthand& shorthand =
+      shorthand_id == CSSPropertyBackground ? backgroundShorthand()
+                                            : webkitMaskShorthand();
+
+  const unsigned longhand_count = shorthand.length();
+  CSSValue* longhands[10] = {nullptr};
+  DCHECK_LE(longhand_count, 10u);
+
+  bool implicit = false;
+  do {
+    bool parsed_longhand[10] = {false};
+    CSSValue* origin_value = nullptr;
+    do {
+      bool found_property = false;
+      for (size_t i = 0; i < longhand_count; ++i) {
+        if (parsed_longhand[i])
+          continue;
+
+        CSSValue* value = nullptr;
+        CSSValue* value_y = nullptr;
+        const CSSProperty& property = *shorthand.properties()[i];
+        if (property.IDEquals(CSSPropertyBackgroundRepeatX) ||
+            property.IDEquals(CSSPropertyWebkitMaskRepeatX)) {
+          CSSParsingUtils::ConsumeRepeatStyleComponent(range, value, value_y,
+                                                       implicit);
+        } else if (property.IDEquals(CSSPropertyBackgroundPositionX) ||
+                   property.IDEquals(CSSPropertyWebkitMaskPositionX)) {
+          if (!CSSPropertyParserHelpers::ConsumePosition(
+                  range, context,
+                  CSSPropertyParserHelpers::UnitlessQuirk::kForbid,
+                  WebFeature::kThreeValuedPositionBackground, value, value_y))
+            continue;
+        } else if (property.IDEquals(CSSPropertyBackgroundSize) ||
+                   property.IDEquals(CSSPropertyWebkitMaskSize)) {
+          if (!CSSPropertyParserHelpers::ConsumeSlashIncludingWhitespace(range))
+            continue;
+          value = CSSParsingUtils::ConsumeBackgroundSize(
+              range, context.Mode(), CSSParsingUtils::ParsingStyle::kNotLegacy);
+          if (!value ||
+              !parsed_longhand[i - 1])  // Position must have been
+                                        // parsed in the current layer.
+          {
+            return false;
+          }
+        } else if (property.IDEquals(CSSPropertyBackgroundPositionY) ||
+                   property.IDEquals(CSSPropertyBackgroundRepeatY) ||
+                   property.IDEquals(CSSPropertyWebkitMaskPositionY) ||
+                   property.IDEquals(CSSPropertyWebkitMaskRepeatY)) {
+          continue;
+        } else {
+          value =
+              ConsumeBackgroundComponent(property.PropertyID(), range, context);
+        }
+        if (value) {
+          if (property.IDEquals(CSSPropertyBackgroundOrigin) ||
+              property.IDEquals(CSSPropertyWebkitMaskOrigin)) {
+            origin_value = value;
+          }
+          parsed_longhand[i] = true;
+          found_property = true;
+          CSSParsingUtils::AddBackgroundValue(longhands[i], value);
+          if (value_y) {
+            parsed_longhand[i + 1] = true;
+            CSSParsingUtils::AddBackgroundValue(longhands[i + 1], value_y);
+          }
+        }
+      }
+      if (!found_property)
+        return false;
+    } while (!range.AtEnd() && range.Peek().GetType() != kCommaToken);
+
+    // TODO(timloh): This will make invalid longhands, see crbug.com/386459
+    for (size_t i = 0; i < longhand_count; ++i) {
+      const CSSProperty& property = *shorthand.properties()[i];
+      if (property.IDEquals(CSSPropertyBackgroundColor) && !range.AtEnd()) {
+        if (parsed_longhand[i])
+          return false;  // Colors are only allowed in the last layer.
+        continue;
+      }
+      if ((property.IDEquals(CSSPropertyBackgroundClip) ||
+           property.IDEquals(CSSPropertyWebkitMaskClip)) &&
+          !parsed_longhand[i] && origin_value) {
+        CSSParsingUtils::AddBackgroundValue(longhands[i], origin_value);
+        continue;
+      }
+      if (!parsed_longhand[i]) {
+        CSSParsingUtils::AddBackgroundValue(longhands[i],
+                                            CSSInitialValue::Create());
+      }
+    }
+  } while (CSSPropertyParserHelpers::ConsumeCommaIncludingWhitespace(range));
+  if (!range.AtEnd())
+    return false;
+
+  for (size_t i = 0; i < longhand_count; ++i) {
+    const CSSProperty& property = *shorthand.properties()[i];
+    if (property.IDEquals(CSSPropertyBackgroundSize) && longhands[i] &&
+        context.UseLegacyBackgroundSizeShorthandBehavior())
+      continue;
+    CSSPropertyParserHelpers::AddProperty(
+        property.PropertyID(), shorthand.id(), *longhands[i], important,
+        implicit ? CSSPropertyParserHelpers::IsImplicitProperty::kImplicit
+                 : CSSPropertyParserHelpers::IsImplicitProperty::kNotImplicit,
+        properties);
+  }
+  return true;
 }
 
 }  // namespace CSSShorthand
diff --git a/third_party/WebKit/Source/core/css/properties/shorthands/WebkitMask.cpp b/third_party/WebKit/Source/core/css/properties/shorthands/WebkitMask.cpp
deleted file mode 100644
index 49f1dae3c..0000000
--- a/third_party/WebKit/Source/core/css/properties/shorthands/WebkitMask.cpp
+++ /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 "core/css/properties/shorthands/WebkitMask.h"
-
-#include "core/css/properties/CSSParsingUtils.h"
-
-namespace blink {
-namespace CSSShorthand {
-
-bool WebkitMask::ParseShorthand(
-    bool important,
-    CSSParserTokenRange& range,
-    const CSSParserContext& context,
-    const CSSParserLocalContext& local_context,
-    HeapVector<CSSPropertyValue, 256>& properties) const {
-  return CSSParsingUtils::ParseBackgroundOrMask(important, range, context,
-                                                local_context, properties);
-}
-
-}  // namespace CSSShorthand
-}  // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGElement.cpp b/third_party/WebKit/Source/core/svg/SVGElement.cpp
index be8cb608..58221ee 100644
--- a/third_party/WebKit/Source/core/svg/SVGElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGElement.cpp
@@ -444,8 +444,7 @@
   Element::ChildrenChanged(change);
 
   // Invalidate all instances associated with us.
-  if (!change.by_parser)
-    InvalidateInstances();
+  InvalidateInstances();
 }
 
 CSSPropertyID SVGElement::CssPropertyIdForSVGAttributeName(
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerInstalledScriptsManagerTest.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerInstalledScriptsManagerTest.cpp
index 33582c7..11e0345 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerInstalledScriptsManagerTest.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerInstalledScriptsManagerTest.cpp
@@ -120,7 +120,7 @@
 
 }  // namespace
 
-class ServiceWorkerInstalledScriptsManagerTest : public testing::Test {
+class ServiceWorkerInstalledScriptsManagerTest : public ::testing::Test {
  public:
   ServiceWorkerInstalledScriptsManagerTest()
       : io_thread_(Platform::Current()->CreateThread("io thread")),
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a267d260..699935d 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -12150,6 +12150,7 @@
   <int value="404" label="AbusiveExperienceInterventionEnforce"/>
   <int value="405" label="SpellcheckLanguage"/>
   <int value="406" label="SecondaryGoogleAccountSigninAllowed"/>
+  <int value="407" label="ThirdPartyBlockingEnabled"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations">
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index af92e95..797344f 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -42295,6 +42295,9 @@
 </histogram>
 
 <histogram name="Net.DiskCache.Size" units="MB">
+  <obsolete>
+    Removed in Chrome 65.
+  </obsolete>
   <owner>erikchen@chromium.org</owner>
   <summary>
     The sum of the size of all files in the HTTP cache directory.
diff --git a/tools/perf/contrib/leak_detection/data/leak_detection.json b/tools/perf/contrib/leak_detection/data/leak_detection.json
index 637939b..7743170 100644
--- a/tools/perf/contrib/leak_detection/data/leak_detection.json
+++ b/tools/perf/contrib/leak_detection/data/leak_detection.json
@@ -1,58 +1,67 @@
 {
     "archives": {
         "http://infomoney.com.br": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.aljazeera.net": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
+        },
+        "http://www.amazon.com": {
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.cheapoair.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.dailypost.ng": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.listindiario.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.onlinedown.net": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.qq.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.quora.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "http://www.time.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
+        },
+        "http://www.twitter.com": {
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.baidu.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.citi.com": {
             "DEFAULT": "leak_detection_002.wprgo"
         },
         "https://www.facebook.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.google.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.macys.com": {
-            "DEFAULT": "leak_detection_001.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
+        },
+        "https://www.prezi.com": {
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.reddit.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.wikipedia.org": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.yahoo.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         },
         "https://www.youtube.com": {
-            "DEFAULT": "leak_detection_002.wprgo"
+            "DEFAULT": "leak_detection_003.wprgo"
         }
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
diff --git a/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo b/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo
new file mode 100644
index 0000000..04cc187
--- /dev/null
+++ b/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo
Binary files differ
diff --git a/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo.sha1 b/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo.sha1
new file mode 100644
index 0000000..008961ca
--- /dev/null
+++ b/tools/perf/contrib/leak_detection/data/leak_detection_003.wprgo.sha1
@@ -0,0 +1 @@
+c1545020790af562064421c06521b3e56be437e0
\ No newline at end of file
diff --git a/tools/perf/contrib/leak_detection/page_sets.py b/tools/perf/contrib/leak_detection/page_sets.py
index 23dc40a..f5d8e43d 100644
--- a/tools/perf/contrib/leak_detection/page_sets.py
+++ b/tools/perf/contrib/leak_detection/page_sets.py
@@ -29,16 +29,20 @@
     urls_list = [
       # Alexa top websites
       'https://www.google.com',
-      'https://www.youtube.com',
+      # TODO(yuzus) Disabling youtube for the moment because of a crash when
+      # running PrepareForLeakDetection with ServiceWorker. (crbug.com/795665)
+      # 'https://www.youtube.com',
       'https://www.facebook.com',
       'https://www.baidu.com',
       'https://www.wikipedia.org',
       'https://www.yahoo.com',
       'https://www.reddit.com',
       'http://www.qq.com',
+      'http://www.amazon.com',
+      'http://www.twitter.com',
       # websites which found to be leaking in the past
       'https://www.macys.com',
-      'https://www.citi.com',
+      'https://www.prezi.com',
       'http://www.time.com',
       'http://infomoney.com.br',
       'http://www.cheapoair.com',
diff --git a/ui/gfx/geometry/mojo/OWNERS b/ui/gfx/geometry/mojo/OWNERS
index 1841ff61..e75daf74 100644
--- a/ui/gfx/geometry/mojo/OWNERS
+++ b/ui/gfx/geometry/mojo/OWNERS
@@ -3,3 +3,6 @@
 
 per-file *.mojom=set noparent
 per-file *.mojom=file://ipc/SECURITY_OWNERS
+
+per-file *.typemap=set noparent
+per-file *.typemap=file://ipc/SECURITY_OWNERS
diff --git a/ui/gfx/geometry/mojo/geometry.mojom b/ui/gfx/geometry/mojo/geometry.mojom
index fb257c1..9b8342f 100644
--- a/ui/gfx/geometry/mojo/geometry.mojom
+++ b/ui/gfx/geometry/mojo/geometry.mojom
@@ -68,3 +68,8 @@
   float x;
   float y;
 };
+
+struct ScrollOffset {
+  float x;
+  float y;
+};
diff --git a/ui/gfx/geometry/mojo/geometry.typemap b/ui/gfx/geometry/mojo/geometry.typemap
index 686ea05..5277530 100644
--- a/ui/gfx/geometry/mojo/geometry.typemap
+++ b/ui/gfx/geometry/mojo/geometry.typemap
@@ -10,6 +10,7 @@
   "//ui/gfx/geometry/rect.h",
   "//ui/gfx/geometry/rect_f.h",
   "//ui/gfx/geometry/safe_integer_conversions.h",
+  "//ui/gfx/geometry/scroll_offset.h",
   "//ui/gfx/geometry/insets.h",
   "//ui/gfx/geometry/vector2d.h",
   "//ui/gfx/geometry/vector2d_f.h",
@@ -29,4 +30,5 @@
   "gfx.mojom.InsetsF=gfx::InsetsF",
   "gfx.mojom.Vector2d=gfx::Vector2d",
   "gfx.mojom.Vector2dF=gfx::Vector2dF",
+  "gfx.mojom.ScrollOffset=gfx::ScrollOffset",
 ]
diff --git a/ui/gfx/geometry/mojo/geometry_struct_traits.h b/ui/gfx/geometry/mojo/geometry_struct_traits.h
index a31d738..2fcd37cc 100644
--- a/ui/gfx/geometry/mojo/geometry_struct_traits.h
+++ b/ui/gfx/geometry/mojo/geometry_struct_traits.h
@@ -12,6 +12,7 @@
 #include "ui/gfx/geometry/point_f.h"
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/rect_f.h"
+#include "ui/gfx/geometry/scroll_offset.h"
 #include "ui/gfx/geometry/size.h"
 #include "ui/gfx/geometry/size_f.h"
 #include "ui/gfx/geometry/vector2d.h"
@@ -141,6 +142,18 @@
   }
 };
 
+template <>
+struct StructTraits<gfx::mojom::ScrollOffsetDataView, gfx::ScrollOffset> {
+  static float x(const gfx::ScrollOffset& v) { return v.x(); }
+  static float y(const gfx::ScrollOffset& v) { return v.y(); }
+  static bool Read(gfx::mojom::ScrollOffsetDataView data,
+                   gfx::ScrollOffset* out) {
+    out->set_x(data.x());
+    out->set_y(data.y());
+    return true;
+  }
+};
+
 }  // namespace mojo
 
 #endif  // UI_GFX_GEOMETRY_MOJO_GEOMETRY_STRUCT_TRAITS_H_
diff --git a/ui/ozone/platform/drm/BUILD.gn b/ui/ozone/platform/drm/BUILD.gn
index 732e2d52..3eee627 100644
--- a/ui/ozone/platform/drm/BUILD.gn
+++ b/ui/ozone/platform/drm/BUILD.gn
@@ -117,6 +117,7 @@
     "//services/ui/public/interfaces:constants",
     "//skia",
     "//third_party/libdrm",
+    "//third_party/libsync",
     "//third_party/minigbm",
     "//ui/base",
     "//ui/display",
@@ -168,6 +169,7 @@
 
   deps = [
     ":gbm",
+    "//base/test:test_support",
     "//skia",
     "//testing/gtest",
     "//third_party/libdrm",
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
index bd97c2e..1abc94f 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator.cc
@@ -6,6 +6,7 @@
 
 #include <drm_fourcc.h>
 
+#include "base/files/platform_file.h"
 #include "ui/gfx/geometry/size_conversions.h"
 #include "ui/ozone/platform/drm/common/drm_util.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
@@ -89,7 +90,8 @@
                                  buffer_generator_, &reusable_buffers);
 
     OverlayPlane plane(buffer, params[i].plane_z_order, params[i].transform,
-                       params[i].display_rect, params[i].crop_rect);
+                       params[i].display_rect, params[i].crop_rect,
+                       base::kInvalidPlatformFile);
     test_list.push_back(plane);
 
     if (buffer && controller->TestPageFlip(test_list)) {
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
index 8bd1bd1..0328b0c 100644
--- a/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_overlay_validator_unittest.cc
@@ -9,6 +9,7 @@
 #include <memory>
 #include <utility>
 
+#include "base/files/platform_file.h"
 #include "base/message_loop/message_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/ozone/common/gpu/ozone_gpu_message_params.h"
@@ -137,7 +138,7 @@
       params.buffer_size);
   ui::OverlayPlane plane(std::move(scanout_buffer), params.plane_z_order,
                          params.transform, params.display_rect,
-                         params.crop_rect);
+                         params.crop_rect, base::kInvalidPlatformFile);
   plane_list_.push_back(plane);
 }
 
@@ -274,7 +275,8 @@
   controller->AddCrtc(std::unique_ptr<ui::CrtcController>(
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(primary_rect_.size())));
+                              new ui::MockScanoutBuffer(primary_rect_.size())),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode));
 
   gfx::RectF crop_rect = gfx::RectF(0, 0, 0.5, 0.5);
@@ -335,7 +337,8 @@
   controller->AddCrtc(std::unique_ptr<ui::CrtcController>(
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(primary_rect_.size())));
+                              new ui::MockScanoutBuffer(primary_rect_.size())),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller->Modeset(plane1, kDefaultMode));
 
   overlay_params_.back().buffer_size = overlay_rect_.size();
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.cc b/ui/ozone/platform/drm/gpu/drm_thread.cc
index 9dfc1ee..a00011f 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.cc
+++ b/ui/ozone/platform/drm/gpu/drm_thread.cc
@@ -77,7 +77,8 @@
 
 }  // namespace
 
-DrmThread::DrmThread() : base::Thread("DrmThread"), binding_(this) {}
+DrmThread::DrmThread()
+    : base::Thread("DrmThread"), binding_(this), weak_ptr_factory_(this) {}
 
 DrmThread::~DrmThread() {
   Stop();
@@ -189,6 +190,19 @@
 void DrmThread::SchedulePageFlip(gfx::AcceleratedWidget widget,
                                  const std::vector<OverlayPlane>& planes,
                                  SwapCompletionOnceCallback callback) {
+  scoped_refptr<ui::DrmDevice> drm_device =
+      device_manager_->GetDrmDevice(widget);
+
+  drm_device->plane_manager()->RequestPlanesReadyCallback(
+      planes, base::BindOnce(&DrmThread::OnPlanesReadyForPageFlip,
+                             weak_ptr_factory_.GetWeakPtr(), widget, planes,
+                             base::Passed(&callback)));
+}
+
+void DrmThread::OnPlanesReadyForPageFlip(
+    gfx::AcceleratedWidget widget,
+    const std::vector<OverlayPlane>& planes,
+    SwapCompletionOnceCallback callback) {
   DrmWindow* window = screen_manager_->GetWindow(widget);
   if (window) {
     bool result = window->SchedulePageFlip(planes, std::move(callback));
diff --git a/ui/ozone/platform/drm/gpu/drm_thread.h b/ui/ozone/platform/drm/gpu/drm_thread.h
index 973409b..5c0dcad 100644
--- a/ui/ozone/platform/drm/gpu/drm_thread.h
+++ b/ui/ozone/platform/drm/gpu/drm_thread.h
@@ -141,6 +141,10 @@
   void Init() override;
 
  private:
+  void OnPlanesReadyForPageFlip(gfx::AcceleratedWidget widget,
+                                const std::vector<OverlayPlane>& planes,
+                                SwapCompletionOnceCallback callback);
+
   std::unique_ptr<DrmDeviceManager> device_manager_;
   std::unique_ptr<ScanoutBufferGenerator> buffer_generator_;
   std::unique_ptr<ScreenManager> screen_manager_;
@@ -153,6 +157,8 @@
   // The mojo implementation of DrmDevice can use a simple binding.
   mojo::Binding<ozone::mojom::DrmDevice> binding_;
 
+  base::WeakPtrFactory<DrmThread> weak_ptr_factory_;
+
   DISALLOW_COPY_AND_ASSIGN(DrmThread);
 };
 
diff --git a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
index fdef5de..4faa632 100644
--- a/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/drm_window_unittest.cc
@@ -11,6 +11,7 @@
 #include <utility>
 #include <vector>
 
+#include "base/files/platform_file.h"
 #include "base/macros.h"
 #include "base/message_loop/message_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -174,7 +175,8 @@
   ui::MockDumbBufferGenerator buffer_generator;
   ui::DrmWindow* window = screen_manager_->GetWindow(kDefaultWidgetHandle);
   ui::OverlayPlane plane(
-      buffer_generator.Create(drm_, DRM_FORMAT_XRGB8888, window_size));
+      buffer_generator.Create(drm_, DRM_FORMAT_XRGB8888, window_size),
+      base::kInvalidPlatformFile);
 
   drm_->set_page_flip_expectation(false);
 
diff --git a/ui/ozone/platform/drm/gpu/gbm_buffer.cc b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
index 54e74b1b..788e523 100644
--- a/ui/ozone/platform/drm/gpu/gbm_buffer.cc
+++ b/ui/ozone/platform/drm/gpu/gbm_buffer.cc
@@ -10,6 +10,7 @@
 #include <xf86drm.h>
 #include <utility>
 
+#include "base/files/platform_file.h"
 #include "base/logging.h"
 #include "base/posix/eintr_wrapper.h"
 #include "base/strings/stringprintf.h"
@@ -387,8 +388,9 @@
                                      const gfx::Rect& display_bounds,
                                      const gfx::RectF& crop_rect) {
   DCHECK(buffer_->GetFlags() & GBM_BO_USE_SCANOUT);
-  surface_manager_->GetSurface(widget)->QueueOverlayPlane(OverlayPlane(
-      buffer_, plane_z_order, plane_transform, display_bounds, crop_rect));
+  surface_manager_->GetSurface(widget)->QueueOverlayPlane(
+      OverlayPlane(buffer_, plane_z_order, plane_transform, display_bounds,
+                   crop_rect, base::kInvalidPlatformFile));
 
   return true;
 }
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
index a2edcdb5..afc1acf 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_controller_unittest.cc
@@ -87,7 +87,8 @@
 
 TEST_F(HardwareDisplayControllerTest, CheckModesettingResult) {
   ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                             new ui::MockScanoutBuffer(kDefaultModeSize)),
+                         base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane, kDefaultMode));
   EXPECT_FALSE(plane.buffer->HasOneRef());
@@ -95,12 +96,14 @@
 
 TEST_F(HardwareDisplayControllerTest, CheckStateAfterPageFlip) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
   ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane2);
   controller_->SchedulePageFlip(
@@ -120,7 +123,8 @@
   drm_->set_set_crtc_expectation(false);
 
   ui::OverlayPlane plane(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                             new ui::MockScanoutBuffer(kDefaultModeSize)),
+                         base::kInvalidPlatformFile);
 
   EXPECT_FALSE(controller_->Modeset(plane, kDefaultMode));
 }
@@ -129,12 +133,14 @@
   drm_->set_page_flip_expectation(false);
 
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
   ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane2);
   controller_->SchedulePageFlip(
@@ -151,11 +157,12 @@
 
 TEST_F(HardwareDisplayControllerTest, CheckOverlayPresent) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   ui::OverlayPlane plane2(
       scoped_refptr<ui::ScanoutBuffer>(new ui::MockScanoutBuffer(kOverlaySize)),
       1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kOverlaySize),
-      gfx::RectF(kDefaultModeSizeF));
+      gfx::RectF(kDefaultModeSizeF), base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
@@ -175,11 +182,12 @@
 
 TEST_F(HardwareDisplayControllerTest, CheckOverlayTestMode) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   ui::OverlayPlane plane2(
       scoped_refptr<ui::ScanoutBuffer>(new ui::MockScanoutBuffer(kOverlaySize)),
       1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kOverlaySize),
-      gfx::RectF(kDefaultModeSizeF));
+      gfx::RectF(kDefaultModeSizeF), base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
@@ -212,12 +220,13 @@
 
 TEST_F(HardwareDisplayControllerTest, RejectUnderlays) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
-  ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
                               new ui::MockScanoutBuffer(kDefaultModeSize)),
-                          -1, gfx::OVERLAY_TRANSFORM_NONE,
-                          gfx::Rect(kDefaultModeSize),
-                          gfx::RectF(kDefaultModeSizeF));
+                          base::kInvalidPlatformFile);
+  ui::OverlayPlane plane2(
+      scoped_refptr<ui::ScanoutBuffer>(
+          new ui::MockScanoutBuffer(kDefaultModeSize)),
+      -1, gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kDefaultModeSize),
+      gfx::RectF(kDefaultModeSizeF), base::kInvalidPlatformFile);
 
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
@@ -237,12 +246,14 @@
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
 
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   EXPECT_EQ(2, drm_->get_set_crtc_call_count());
 
   ui::OverlayPlane plane2(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane2);
   controller_->SchedulePageFlip(
@@ -257,7 +268,8 @@
 
 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterRemoveCrtc) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -296,7 +308,8 @@
 
 TEST_F(HardwareDisplayControllerTest, PlaneStateAfterDestroyingCrtc) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -327,7 +340,8 @@
       new ui::CrtcController(drm_.get(), kSecondaryCrtc, kSecondaryConnector)));
 
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -375,7 +389,8 @@
 
 TEST_F(HardwareDisplayControllerTest, ModesetWhilePageFlipping) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -393,7 +408,8 @@
   drm_->set_page_flip_expectation(false);
 
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -410,7 +426,8 @@
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
                               new ui::MockScanoutBuffer(kDefaultModeSize)),
                           1, gfx::OVERLAY_TRANSFORM_NONE,
-                          gfx::Rect(kDefaultModeSize), gfx::RectF(0, 0, 1, 1));
+                          gfx::Rect(kDefaultModeSize), gfx::RectF(0, 0, 1, 1),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -425,7 +442,8 @@
 
 TEST_F(HardwareDisplayControllerTest, AddCrtcMidPageFlip) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -443,7 +461,8 @@
 
 TEST_F(HardwareDisplayControllerTest, RemoveCrtcMidPageFlip) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
   std::vector<ui::OverlayPlane> planes =
       std::vector<ui::OverlayPlane>(1, plane1);
@@ -461,12 +480,14 @@
 
 TEST_F(HardwareDisplayControllerTest, Disable) {
   ui::OverlayPlane plane1(scoped_refptr<ui::ScanoutBuffer>(
-      new ui::MockScanoutBuffer(kDefaultModeSize)));
+                              new ui::MockScanoutBuffer(kDefaultModeSize)),
+                          base::kInvalidPlatformFile);
   EXPECT_TRUE(controller_->Modeset(plane1, kDefaultMode));
 
   ui::OverlayPlane plane2(new ui::MockScanoutBuffer(kOverlaySize), 1,
                           gfx::OVERLAY_TRANSFORM_NONE, gfx::Rect(kOverlaySize),
-                          gfx::RectF(kDefaultModeSizeF));
+                          gfx::RectF(kDefaultModeSizeF),
+                          base::kInvalidPlatformFile);
   std::vector<ui::OverlayPlane> planes;
   planes.push_back(plane1);
   planes.push_back(plane2);
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
index f583db2..e7c2cf9 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.cc
@@ -20,6 +20,7 @@
 const char* kSrcWPropName = "SRC_W";
 const char* kSrcHPropName = "SRC_H";
 const char* kRotationPropName = "rotation";
+const char* kInFenceFdPropName = "IN_FENCE_FD";
 
 // TODO(dcastagna): Remove the following defines once they're in libdrm headers.
 #if !defined(DRM_ROTATE_0)
@@ -86,7 +87,8 @@
     uint32_t framebuffer,
     const gfx::Rect& crtc_rect,
     const gfx::Rect& src_rect,
-    const gfx::OverlayTransform transform) {
+    const gfx::OverlayTransform transform,
+    int in_fence_fd) {
   if (transform != gfx::OVERLAY_TRANSFORM_NONE && !rotation_prop_.id)
     return false;
 
@@ -119,6 +121,12 @@
             property_set, plane_id_, rotation_prop_.id,
             OverlayTransformToDrmRotationPropertyValue(transform));
   }
+  if (in_fence_fd_prop_.id && in_fence_fd >= 0) {
+    plane_set_succeeded =
+        plane_set_succeeded &&
+        drmModeAtomicAddProperty(property_set, plane_id_, in_fence_fd_prop_.id,
+                                 in_fence_fd);
+  }
   if (!plane_set_succeeded) {
     PLOG(ERROR) << "Failed to set plane data";
     return false;
@@ -144,8 +152,9 @@
     LOG(ERROR) << "Unable to get plane properties.";
     return false;
   }
-  // "rotation" property is optional.
+  // The following properties are optional.
   rotation_prop_.Initialize(drm, kRotationPropName, plane_props);
+  in_fence_fd_prop_.Initialize(drm, kInFenceFdPropName, plane_props);
   return true;
 }
 
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h
index 5d58a46..bf7ddde3 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h
@@ -30,7 +30,8 @@
                     uint32_t framebuffer,
                     const gfx::Rect& crtc_rect,
                     const gfx::Rect& src_rect,
-                    const gfx::OverlayTransform transform);
+                    const gfx::OverlayTransform transform,
+                    int in_fence_fd);
 
   void set_crtc(CrtcController* crtc) { crtc_ = crtc; }
   CrtcController* crtc() const { return crtc_; }
@@ -59,6 +60,7 @@
   Property src_w_prop_;
   Property src_h_prop_;
   Property rotation_prop_;
+  Property in_fence_fd_prop_;
   CrtcController* crtc_ = nullptr;
 };
 
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
index 3ad0eb25..175ca07 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager.h
@@ -103,6 +103,12 @@
     return planes_;
   }
 
+  // Request a callback to be called when the planes are ready to be displayed.
+  // The callback will be invoked in the caller's execution context (same
+  // sequence or thread).
+  virtual void RequestPlanesReadyCallback(const OverlayPlaneList& planes,
+                                          base::OnceClosure callback) = 0;
+
   // Returns all formats which can be scanned out by this PlaneManager. Use
   // IsFormatSupported to find if a given format is supported on a particular
   // plane for a given crtc.
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
index f74c042..febc994 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.cc
@@ -5,7 +5,9 @@
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h"
 
 #include "base/bind.h"
+#include "base/files/platform_file.h"
 #include "base/stl_util.h"
+#include "base/threading/sequenced_task_runner_handle.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_atomic.h"
@@ -42,9 +44,9 @@
       plane->set_in_use(false);
       HardwareDisplayPlaneAtomic* atomic_plane =
           static_cast<HardwareDisplayPlaneAtomic*>(plane);
-      atomic_plane->SetPlaneData(plane_list->atomic_property_set.get(), 0, 0,
-                                 gfx::Rect(), gfx::Rect(),
-                                 gfx::OVERLAY_TRANSFORM_NONE);
+      atomic_plane->SetPlaneData(
+          plane_list->atomic_property_set.get(), 0, 0, gfx::Rect(), gfx::Rect(),
+          gfx::OVERLAY_TRANSFORM_NONE, base::kInvalidPlatformFile);
     }
   }
 
@@ -99,9 +101,9 @@
 
     HardwareDisplayPlaneAtomic* atomic_plane =
         static_cast<HardwareDisplayPlaneAtomic*>(plane);
-    atomic_plane->SetPlaneData(plane_list->atomic_property_set.get(), 0, 0,
-                               gfx::Rect(), gfx::Rect(),
-                               gfx::OVERLAY_TRANSFORM_NONE);
+    atomic_plane->SetPlaneData(
+        plane_list->atomic_property_set.get(), 0, 0, gfx::Rect(), gfx::Rect(),
+        gfx::OVERLAY_TRANSFORM_NONE, base::kInvalidPlatformFile);
   }
   // The list of crtcs is only useful if flags contains DRM_MODE_PAGE_FLIP_EVENT
   // to get the pageflip callback. In this case we don't need to be notified
@@ -124,6 +126,13 @@
   return true;
 }
 
+void HardwareDisplayPlaneManagerAtomic::RequestPlanesReadyCallback(
+    const OverlayPlaneList& planes,
+    base::OnceClosure callback) {
+  base::SequencedTaskRunnerHandle::Get()->PostTask(FROM_HERE,
+                                                   std::move(callback));
+}
+
 bool HardwareDisplayPlaneManagerAtomic::SetPlaneData(
     HardwareDisplayPlaneList* plane_list,
     HardwareDisplayPlane* hw_plane,
@@ -136,9 +145,10 @@
   uint32_t framebuffer_id = overlay.z_order
                                 ? overlay.buffer->GetFramebufferId()
                                 : overlay.buffer->GetOpaqueFramebufferId();
-  if (!atomic_plane->SetPlaneData(
-          plane_list->atomic_property_set.get(), crtc_id, framebuffer_id,
-          overlay.display_bounds, src_rect, overlay.plane_transform)) {
+  if (!atomic_plane->SetPlaneData(plane_list->atomic_property_set.get(),
+                                  crtc_id, framebuffer_id,
+                                  overlay.display_bounds, src_rect,
+                                  overlay.plane_transform, overlay.fence_fd)) {
     LOG(ERROR) << "Failed to set plane properties";
     return false;
   }
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
index 0bf0a66..7dd8b19 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h
@@ -25,6 +25,9 @@
   bool ValidatePrimarySize(const OverlayPlane& primary,
                            const drmModeModeInfo& mode) override;
 
+  void RequestPlanesReadyCallback(const OverlayPlaneList& planes,
+                                  base::OnceClosure callback) override;
+
  private:
   bool SetPlaneData(HardwareDisplayPlaneList* plane_list,
                     HardwareDisplayPlane* hw_plane,
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
index 76cbb75..8aaf4e28 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.cc
@@ -5,8 +5,11 @@
 #include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
 
 #include <errno.h>
+#include <sync/sync.h>
 
 #include "base/bind.h"
+#include "base/posix/eintr_wrapper.h"
+#include "base/task_scheduler/post_task.h"
 #include "ui/gfx/presentation_feedback.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
 #include "ui/ozone/platform/drm/gpu/drm_device.h"
@@ -14,6 +17,22 @@
 
 namespace ui {
 
+namespace {
+
+const int kInfiniteSyncWaitTimeout = -1;
+
+// We currently wait for the fences serially, but it's possible
+// that merging the fences and waiting on the merged fence fd
+// is more efficient. We should revisit once we have more info.
+void WaitForPlaneFences(const ui::OverlayPlaneList& planes) {
+  for (const auto& plane : planes) {
+    if (plane.fence_fd >= 0)
+      sync_wait(plane.fence_fd, kInfiniteSyncWaitTimeout);
+  }
+}
+
+}  // namespace
+
 HardwareDisplayPlaneManagerLegacy::HardwareDisplayPlaneManagerLegacy() {
 }
 
@@ -120,6 +139,15 @@
   return primary.buffer->GetSize() == gfx::Size(mode.hdisplay, mode.vdisplay);
 }
 
+void HardwareDisplayPlaneManagerLegacy::RequestPlanesReadyCallback(
+    const OverlayPlaneList& planes,
+    base::OnceClosure callback) {
+  base::PostTaskWithTraitsAndReply(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&WaitForPlaneFences, planes), std::move(callback));
+}
+
 bool HardwareDisplayPlaneManagerLegacy::SetPlaneData(
     HardwareDisplayPlaneList* plane_list,
     HardwareDisplayPlane* hw_plane,
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
index 7aa559dd..3f492ca 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h
@@ -25,6 +25,9 @@
   bool ValidatePrimarySize(const OverlayPlane& primary,
                            const drmModeModeInfo& mode) override;
 
+  void RequestPlanesReadyCallback(const OverlayPlaneList& planes,
+                                  base::OnceClosure callback) override;
+
  protected:
   bool SetPlaneData(HardwareDisplayPlaneList* plane_list,
                     HardwareDisplayPlane* hw_plane,
diff --git a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
index 533336b..3c5f714 100644
--- a/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/hardware_display_plane_manager_unittest.cc
@@ -3,13 +3,20 @@
 // found in the LICENSE file.
 
 #include <stdint.h>
+#include <unistd.h>
 
 #include <memory>
 
+#include "base/files/file_util.h"
+#include "base/files/platform_file.h"
 #include "base/macros.h"
+#include "base/posix/eintr_wrapper.h"
+#include "base/test/scoped_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
 #include "ui/ozone/platform/drm/gpu/fake_plane_info.h"
+#include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_atomic.h"
+#include "ui/ozone/platform/drm/gpu/hardware_display_plane_manager_legacy.h"
 #include "ui/ozone/platform/drm/gpu/mock_drm_device.h"
 #include "ui/ozone/platform/drm/gpu/mock_hardware_display_plane_manager.h"
 #include "ui/ozone/platform/drm/gpu/mock_scanout_buffer.h"
@@ -56,7 +63,7 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, SinglePlaneAssignment) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
                               default_crtcs_);
   EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
@@ -66,7 +73,7 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, BadCrtc) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
                               default_crtcs_);
   EXPECT_FALSE(
@@ -75,8 +82,8 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, MultiplePlaneAssignment) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kTwoPlanesPerCrtc, arraysize(kTwoPlanesPerCrtc),
                               default_crtcs_);
   EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
@@ -86,8 +93,8 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, NotEnoughPlanes) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
                               default_crtcs_);
 
@@ -97,7 +104,7 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, MultipleCrtcs) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
                               default_crtcs_);
 
@@ -110,8 +117,8 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, MultiplePlanesAndCrtcs) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kTwoPlanesPerCrtc, arraysize(kTwoPlanesPerCrtc),
                               default_crtcs_);
   EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
@@ -123,7 +130,7 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, MultipleFrames) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kTwoPlanesPerCrtc, arraysize(kTwoPlanesPerCrtc),
                               default_crtcs_);
 
@@ -143,7 +150,7 @@
 
 TEST_F(HardwareDisplayPlaneManagerTest, MultipleFramesDifferentPlanes) {
   ui::OverlayPlaneList assigns;
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kTwoPlanesPerCrtc, arraysize(kTwoPlanesPerCrtc),
                               default_crtcs_);
 
@@ -162,8 +169,8 @@
   scoped_refptr<ui::MockScanoutBuffer> buffer =
       new ui::MockScanoutBuffer(gfx::Size(1, 1));
 
-  assigns.push_back(ui::OverlayPlane(fake_buffer_));
-  assigns.push_back(ui::OverlayPlane(buffer));
+  assigns.push_back(ui::OverlayPlane(fake_buffer_, base::kInvalidPlatformFile));
+  assigns.push_back(ui::OverlayPlane(buffer, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtcWithShared,
                               arraysize(kOnePlanePerCrtcWithShared),
                               default_crtcs_);
@@ -180,7 +187,7 @@
   ui::OverlayPlaneList assigns;
   scoped_refptr<ui::MockScanoutBuffer> buffer =
       new ui::MockScanoutBuffer(kDefaultBufferSize, kDummyFormat);
-  assigns.push_back(ui::OverlayPlane(buffer));
+  assigns.push_back(ui::OverlayPlane(buffer, base::kInvalidPlatformFile));
   plane_manager_->InitForTest(kOnePlanePerCrtc, arraysize(kOnePlanePerCrtc),
                               default_crtcs_);
   plane_manager_->BeginFrame(&state_);
@@ -191,7 +198,7 @@
   assigns.clear();
   scoped_refptr<ui::MockScanoutBuffer> xrgb_buffer =
       new ui::MockScanoutBuffer(kDefaultBufferSize);
-  assigns.push_back(ui::OverlayPlane(xrgb_buffer));
+  assigns.push_back(ui::OverlayPlane(xrgb_buffer, base::kInvalidPlatformFile));
   plane_manager_->BeginFrame(&state_);
   EXPECT_TRUE(plane_manager_->AssignOverlayPlanes(&state_, assigns,
                                                   default_crtcs_[0], nullptr));
@@ -210,8 +217,10 @@
       new ui::MockScanoutBuffer(kDefaultBufferSize);
   scoped_refptr<ui::MockScanoutBuffer> overlay_buffer =
       new ui::MockScanoutBuffer(gfx::Size(1, 1));
-  assigns.push_back(ui::OverlayPlane(primary_buffer));
-  assigns.push_back(ui::OverlayPlane(overlay_buffer));
+  assigns.push_back(
+      ui::OverlayPlane(primary_buffer, base::kInvalidPlatformFile));
+  assigns.push_back(
+      ui::OverlayPlane(overlay_buffer, base::kInvalidPlatformFile));
   ui::HardwareDisplayPlaneList hdpl;
   ui::CrtcController crtc(drm, crtcs[0], 0);
   drm->plane_manager()->BeginFrame(&hdpl);
@@ -219,7 +228,8 @@
                                                         crtcs[0], &crtc));
   EXPECT_TRUE(drm->plane_manager()->Commit(&hdpl, false));
   assigns.clear();
-  assigns.push_back(ui::OverlayPlane(primary_buffer));
+  assigns.push_back(
+      ui::OverlayPlane(primary_buffer, base::kInvalidPlatformFile));
   drm->plane_manager()->BeginFrame(&hdpl);
   EXPECT_TRUE(drm->plane_manager()->AssignOverlayPlanes(&hdpl, assigns,
                                                         crtcs[0], &crtc));
@@ -228,4 +238,128 @@
   EXPECT_EQ(1, drm->get_overlay_clear_call_count());
 }
 
+class FakeFenceFD {
+ public:
+  FakeFenceFD();
+
+  int get() const;
+  void signal() const;
+
+ private:
+  base::ScopedFD read_fd;
+  base::ScopedFD write_fd;
+};
+
+FakeFenceFD::FakeFenceFD() {
+  int fds[2];
+  base::CreateLocalNonBlockingPipe(fds);
+  read_fd = base::ScopedFD(fds[0]);
+  write_fd = base::ScopedFD(fds[1]);
+}
+
+int FakeFenceFD::get() const {
+  return read_fd.get();
+}
+
+void FakeFenceFD::signal() const {
+  base::WriteFileDescriptor(write_fd.get(), "a", 1);
+}
+
+class HardwareDisplayPlaneManagerPlanesReadyTest : public testing::Test {
+ protected:
+  HardwareDisplayPlaneManagerPlanesReadyTest() = default;
+
+  void UseLegacyManager();
+  void UseAtomicManager();
+  void RequestPlanesReady(const ui::OverlayPlaneList& planes);
+
+  std::unique_ptr<ui::HardwareDisplayPlaneManager> plane_manager_;
+  bool callback_called = false;
+  base::test::ScopedTaskEnvironment task_env_{
+      base::test::ScopedTaskEnvironment::MainThreadType::DEFAULT,
+      base::test::ScopedTaskEnvironment::ExecutionMode::QUEUED};
+  const scoped_refptr<ui::ScanoutBuffer> scanout_buffer{
+      new ui::MockScanoutBuffer(kDefaultBufferSize)};
+  const FakeFenceFD fake_fence_fd1;
+  const FakeFenceFD fake_fence_fd2;
+
+  const ui::OverlayPlaneList planes_without_fences_{
+      ui::OverlayPlane(scanout_buffer, base::kInvalidPlatformFile),
+      ui::OverlayPlane(scanout_buffer, base::kInvalidPlatformFile)};
+  const ui::OverlayPlaneList planes_with_fences_{
+      ui::OverlayPlane(scanout_buffer, fake_fence_fd1.get()),
+      ui::OverlayPlane(scanout_buffer, fake_fence_fd2.get())};
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(HardwareDisplayPlaneManagerPlanesReadyTest);
+};
+
+void HardwareDisplayPlaneManagerPlanesReadyTest::RequestPlanesReady(
+    const ui::OverlayPlaneList& planes) {
+  auto set_true = [](bool* b) { *b = true; };
+  plane_manager_->RequestPlanesReadyCallback(
+      planes, base::BindOnce(set_true, &callback_called));
+}
+
+void HardwareDisplayPlaneManagerPlanesReadyTest::UseLegacyManager() {
+  plane_manager_ = std::make_unique<ui::HardwareDisplayPlaneManagerLegacy>();
+}
+
+void HardwareDisplayPlaneManagerPlanesReadyTest::UseAtomicManager() {
+  plane_manager_ = std::make_unique<ui::HardwareDisplayPlaneManagerAtomic>();
+}
+
+TEST_F(HardwareDisplayPlaneManagerPlanesReadyTest,
+       LegacyWithoutFencesIsAsynchronousWithoutFenceWait) {
+  UseLegacyManager();
+  RequestPlanesReady(planes_without_fences_);
+
+  EXPECT_FALSE(callback_called);
+
+  task_env_.RunUntilIdle();
+
+  EXPECT_TRUE(callback_called);
+}
+
+TEST_F(HardwareDisplayPlaneManagerPlanesReadyTest,
+       LegacyWithFencesIsAsynchronousWithFenceWait) {
+  UseLegacyManager();
+  RequestPlanesReady(planes_with_fences_);
+
+  EXPECT_FALSE(callback_called);
+
+  fake_fence_fd1.signal();
+  fake_fence_fd2.signal();
+
+  EXPECT_FALSE(callback_called);
+
+  task_env_.RunUntilIdle();
+
+  EXPECT_TRUE(callback_called);
+}
+
+TEST_F(HardwareDisplayPlaneManagerPlanesReadyTest,
+       AtomicWithoutFencesIsAsynchronousWithoutFenceWait) {
+  UseAtomicManager();
+  RequestPlanesReady(planes_without_fences_);
+
+  EXPECT_FALSE(callback_called);
+
+  task_env_.RunUntilIdle();
+
+  EXPECT_TRUE(callback_called);
+}
+
+TEST_F(HardwareDisplayPlaneManagerPlanesReadyTest,
+       AtomicWithFencesIsAsynchronousWithoutFenceWait) {
+  UseAtomicManager();
+  RequestPlanesReady(planes_with_fences_);
+
+  EXPECT_FALSE(callback_called);
+
+  task_env_.RunUntilIdle();
+
+  EXPECT_TRUE(callback_called);
+}
+
 }  // namespace
diff --git a/ui/ozone/platform/drm/gpu/overlay_plane.cc b/ui/ozone/platform/drm/gpu/overlay_plane.cc
index e1420720..8135647 100644
--- a/ui/ozone/platform/drm/gpu/overlay_plane.cc
+++ b/ui/ozone/platform/drm/gpu/overlay_plane.cc
@@ -10,22 +10,26 @@
 
 namespace ui {
 
-OverlayPlane::OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer)
+OverlayPlane::OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer,
+                           int fence_fd)
     : buffer(buffer),
       plane_transform(gfx::OVERLAY_TRANSFORM_NONE),
       display_bounds(gfx::Point(), buffer->GetSize()),
-      crop_rect(0, 0, 1, 1) {}
+      crop_rect(0, 0, 1, 1),
+      fence_fd(fence_fd) {}
 
 OverlayPlane::OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer,
                            int z_order,
                            gfx::OverlayTransform plane_transform,
                            const gfx::Rect& display_bounds,
-                           const gfx::RectF& crop_rect)
+                           const gfx::RectF& crop_rect,
+                           int fence_fd)
     : buffer(buffer),
       z_order(z_order),
       plane_transform(plane_transform),
       display_bounds(display_bounds),
-      crop_rect(crop_rect) {}
+      crop_rect(crop_rect),
+      fence_fd(fence_fd) {}
 
 OverlayPlane::OverlayPlane(const OverlayPlane& other) = default;
 
diff --git a/ui/ozone/platform/drm/gpu/overlay_plane.h b/ui/ozone/platform/drm/gpu/overlay_plane.h
index 4bd0fcab..4bfb9b4 100644
--- a/ui/ozone/platform/drm/gpu/overlay_plane.h
+++ b/ui/ozone/platform/drm/gpu/overlay_plane.h
@@ -22,13 +22,15 @@
 
 struct OverlayPlane {
   // Simpler constructor for the primary plane.
-  explicit OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer);
+  explicit OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer,
+                        int fence_fd);
 
   OverlayPlane(const scoped_refptr<ScanoutBuffer>& buffer,
                int z_order,
                gfx::OverlayTransform plane_transform,
                const gfx::Rect& display_bounds,
-               const gfx::RectF& crop_rect);
+               const gfx::RectF& crop_rect,
+               int fence_fd);
   OverlayPlane(const OverlayPlane& other);
 
   bool operator<(const OverlayPlane& plane) const;
@@ -43,6 +45,7 @@
   gfx::OverlayTransform plane_transform;
   gfx::Rect display_bounds;
   gfx::RectF crop_rect;
+  int fence_fd;
 };
 
 }  // namespace ui
diff --git a/ui/ozone/platform/drm/gpu/screen_manager.cc b/ui/ozone/platform/drm/gpu/screen_manager.cc
index 3fd6aa86..87b2abc6 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager.cc
@@ -8,6 +8,7 @@
 
 #include <utility>
 
+#include "base/files/platform_file.h"
 #include "base/memory/ptr_util.h"
 #include "third_party/skia/include/core/SkCanvas.h"
 #include "ui/display/types/display_snapshot.h"
@@ -377,11 +378,11 @@
   if (!buffer) {
     LOG(ERROR) << "Failed to create scanout buffer";
     return OverlayPlane(nullptr, 0, gfx::OVERLAY_TRANSFORM_INVALID, gfx::Rect(),
-                        gfx::RectF());
+                        gfx::RectF(), base::kInvalidPlatformFile);
   }
 
   FillModesetBuffer(drm, controller, buffer.get());
-  return OverlayPlane(buffer);
+  return OverlayPlane(buffer, base::kInvalidPlatformFile);
 }
 
 bool ScreenManager::EnableController(HardwareDisplayController* controller) {
diff --git a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
index 2205af57..ee3d518 100644
--- a/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
+++ b/ui/ozone/platform/drm/gpu/screen_manager_unittest.cc
@@ -8,6 +8,7 @@
 
 #include <utility>
 
+#include "base/files/platform_file.h"
 #include "base/macros.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/ozone/platform/drm/gpu/crtc_controller.h"
@@ -502,7 +503,8 @@
   scoped_refptr<ui::ScanoutBuffer> buffer = buffer_generator_->Create(
       drm_, DRM_FORMAT_XRGB8888, GetPrimaryBounds().size());
   window->SchedulePageFlip(
-      std::vector<ui::OverlayPlane>(1, ui::OverlayPlane(buffer)),
+      std::vector<ui::OverlayPlane>(
+          1, ui::OverlayPlane(buffer, base::kInvalidPlatformFile)),
       base::Bind(&EmptySwapCallback));
   screen_manager_->AddWindow(1, std::move(window));
 
@@ -528,7 +530,8 @@
                                             GetPrimaryBounds().size());
 
   window->SchedulePageFlip(
-      std::vector<ui::OverlayPlane>(1, ui::OverlayPlane(buffer)),
+      std::vector<ui::OverlayPlane>(
+          1, ui::OverlayPlane(buffer, base::kInvalidPlatformFile)),
       base::Bind(&EmptySwapCallback));
   screen_manager_->AddWindow(1, std::move(window));